Ios 填充一组UITextFields的最有效方法
我正在为JSON API支持的iOS应用程序创建“帐户”视图。我已经有了这样的东西来填充基于API结果的所有字段(其中,Ios 填充一组UITextFields的最有效方法,ios,objective-c,json,Ios,Objective C,Json,我正在为JSON API支持的iOS应用程序创建“帐户”视图。我已经有了这样的东西来填充基于API结果的所有字段(其中,results是来自JSON的NSDictionary): 这是可行的,但是如果任何结果是NSNull,我就会得到一个错误。我可以把每一个都包装在一个if语句中,就像这样 if (![[results objectForKey:@"name"] isKindOfClass:[NSNull class]]) { self.nameField.text = [results
results
是来自JSON的NSDictionary):
这是可行的,但是如果任何结果
是NSNull
,我就会得到一个错误。我可以把每一个都包装在一个if
语句中,就像这样
if (![[results objectForKey:@"name"] isKindOfClass:[NSNull class]]) {
self.nameField.text = [results objectForKey:@"name"];
}
…但似乎必须有一种更简单、更有效的方法来做到这一点。我有大约10个字段要填充,要填充的30行代码看起来很可笑
我知道我可以为此创建一个助手方法,但苹果或其他人肯定已经考虑过了吗?有没有更有效的方法来处理这种情况?您可以使用十进制运算符:
self.nameField.text = (results[@"name"] != [NSNull null]) ? results[@"name"] : @"";
您可以使用十进制运算符:
self.nameField.text = (results[@"name"] != [NSNull null]) ? results[@"name"] : @"";
编写一个小帮助方法:
- (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"];
编写一个小帮助方法:
- (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"];
仅供参考,您可以在
NSDictionary
上使用订阅。您不必写出objectForKey:
要回答您明确的问题:
例如,您可以在
.m
文件中编写一个静态内联
函数,或者您可以向类中添加一个方法,或者您可以在UITextField
上编写一个包含my_settextsafe:
方法的类别,或者,您可以在NSDictionary
上编写一个类别,其中包含my\u stringForKey:
方法。仅供参考,您可以在NSDictionary
上使用订阅。您不必写出objectForKey:
要回答您明确的问题:
例如,您可以在
.m
文件中编写一个静态内联
函数,或者您可以向类中添加一个方法,或者您可以在UITextField
上编写一个包含my_settextsafe:
方法的类别,或者您可以在NSDictionary
上编写一个类别,其中包含my_stringForKey:
方法。如果您可以控制文本字段的名称,您可以在字典中的字段后命名它们,并使用键值编码编写几行神奇的代码。比如说,
在视图控制器中,可以创建以下文本字段
@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];
}
}
只要正确命名每个文本字段,处理更多键所需做的就是向keys方法添加一个新的UITextField和一个键。如果您可以控制文本字段的名称,您可以在字典中的字段后命名它们,并使用键值编码编写几行神奇的代码。比如说, 在视图控制器中,可以创建以下文本字段
@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];
}
}
只要正确命名每个文本字段,处理更多键所需做的就是向keys方法添加一个新的UITextField和一个键。
results[@“name”]
将始终为非零。@maddy,为什么results[@“name”]始终为零?如果结果字典不包含键@“name”,它确实应该返回nil。@duncac我说的是“non-nil”,而不是“nil”。您不能将nil
放入NSDictionary
中。如OP所述,它包含NSNull
对象。差别很大。@Kirsteins您的更新是正确的。你又回到错误的答案上来了。@maddy Oops,那是我的类型。至于你的回答,嗯。我接受OPs帖子的意思是结果为零,而不是字典中包含了该键的NSNull。我知道很多人交替使用NULL和nil。也许我们应该要求OP澄清。结果[@“name”]
将始终为非零。@maddy,为什么结果[@“name”]始终为零?如果结果字典不包含键@“name”,它确实应该返回nil。@duncac我说的是“non-nil”,而不是“nil”。您不能将nil
放入NSDictionary
中。如OP所述,它包含NSNull
对象。差别很大。@Kirsteins您的更新是正确的。你又回到错误的答案上来了。@maddy Oops,那是我的类型。至于你的回答,嗯。我接受OPs帖子的意思是结果为零,而不是字典中包含了该键的NSNull。我知道很多人交替使用NULL和nil。也许我们应该要求OP澄清一下。