填充一组UITextField的最有效方法

时间:2013-12-12 17:28:12

标签: ios objective-c json

我正在为支持JSON API的iOS应用创建“帐户”视图。我有这样的东西来填写基于API结果的所有字段(其中results是来自JSON的NSDictionary):

self.nameField.text = [results objectForKey:@"name"];
self.emailField.text = [results objectForKey:@"email"];
self.websiteField.text = [results objectForKey:@"website"];
self.phoneField.text = [results objectForKey:@"phone"]; 

这样可行,但如果results中有任何NSNullif,则会收到错误消息。我可以用if (![[results objectForKey:@"name"] isKindOfClass:[NSNull class]]) { self.nameField.text = [results objectForKey:@"name"]; } 语句包装每一个,就像这样...

{{1}}

...但似乎必须有一个不那么冗长和有效的方法来做到这一点。我有大约10个字段填充,30行代码这样做似乎很荒谬。

我知道我可以为此创建一个帮助方法,但苹果或其他人肯定已经考虑过了吗?有没有更有效的方法来处理这种情况?

4 个答案:

答案 0 :(得分:3)

写一点帮助方法:

- (NSString *)textForKey:(NSString *)key {
    id val = results[key];
    if ([val isKindOfClass:[NSString class]]) {
        return (NSString *)val;
    } else {
        return nil;
    }
}

self.nameField.text = [self textForKey:@"name"];

答案 1 :(得分:1)

仅供参考,您可以在NSDictionary上使用下标。您不必写出objectForKey:

回答你的明确问题:

  1. 我认为公共iOS SDK中没有任何帮助方法。
  2. 据我所知,没有比编写辅助方法或函数“更有效的方法”。
  3. 例如,您可以在static inline文件中编写.m函数,或者可以在课程中添加方法,也可以在包含{UITextField的{​​{1}}上编写类别{1}}方法,或者您可以在my_setTextSafely:上编写包含NSDictionary方法的类别。

答案 2 :(得分:1)

如果您可以控制文本字段的名称,则可以在字典中的字段之后命名它们,并使用键值编码来编写几行魔法代码。例如,

在视图控制器中,您可以创建以下文本字段。

@property (weak, nonatomic) IBOutlet UITextField *nameTextField;
@property (weak, nonatomic) IBOutlet UITextField *emailTextField;
@property (weak, nonatomic) IBOutlet UITextField *websiteTextField;
@property (weak, nonatomic) IBOutlet UITextField *phoneTextField;

然后你可以写一个方法来返回键的值。

- (NSArray *)keys
{
    return @[@"name", @"email", @"website", @"phone"];
}

..以及一种基于密钥获取文本字段的简单方法。

- (UITextField *)textFieldForKey:(NSString *)key
{
    return [self valueForKey:[key stringByAppendingString:@"TextField"]];
}

..然后你可以编写一个方法从字典中获取数据,并对NSNull

做出正确反应
- (NSString *)valueForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary
{
    return dictionary[key] != [NSNull null] ? dictionary[key] : @"";
}

..并自动将其放在每个文本字段中。

- (void)updateTextFields
{
    for (NSString *key in self.keys) 
    {
        [self textFieldForKey:key].text = [self valueForKey:key inDictionary:myDictionary];
    }
}

只要您恰当地命名每个文本字段,处理更多键所需要做的就是添加一个新的UITextField和一个键方法。

答案 3 :(得分:0)

您可以使用三元运算符:

self.nameField.text = (results[@"name"] != [NSNull null]) ? results[@"name"] : @"";