我正在为支持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
中有任何NSNull
为if
,则会收到错误消息。我可以用if (![[results objectForKey:@"name"] isKindOfClass:[NSNull class]]) {
self.nameField.text = [results objectForKey:@"name"];
}
语句包装每一个,就像这样...
{{1}}
...但似乎必须有一个不那么冗长和有效的方法来做到这一点。我有大约10个字段填充,30行代码这样做似乎很荒谬。
我知道我可以为此创建一个帮助方法,但苹果或其他人肯定已经考虑过了吗?有没有更有效的方法来处理这种情况?
答案 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:
。
回答你的明确问题:
例如,您可以在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"] : @"";