Ios 填充一组UITextFields的最有效方法

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

我正在为JSON API支持的iOS应用程序创建“帐户”视图。我已经有了这样的东西来填充基于API结果的所有字段(其中,
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:

要回答您明确的问题:

  • 我认为在公共iOS SDK中没有任何辅助方法可以实现这一点
  • 据我所知,没有比编写助手方法或函数更有效的方法了

  • 例如,您可以在
    .m
    文件中编写一个
    静态内联
    函数,或者您可以向类中添加一个方法,或者您可以在
    UITextField
    上编写一个包含
    my_settextsafe:
    方法的类别,或者,您可以在
    NSDictionary
    上编写一个类别,其中包含
    my\u stringForKey:
    方法。

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

    要回答您明确的问题:

  • 我认为在公共iOS SDK中没有任何辅助方法可以实现这一点
  • 据我所知,没有比编写助手方法或函数更有效的方法了

  • 例如,您可以在
    .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澄清一下。