2013-12-12 5 views
0

Я создаю представление «учетная запись» для приложения, поддерживающего JSON API, поддерживаемого iOS. У меня есть что-то вроде этого, чтобы заполнить все поля, основываясь на результатах API (где results является NSDictionary из JSON):Наиболее эффективный способ заполнения набора UITextFields

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"]; 
} 

... но мне кажется, что там должен быть менее многословным и более эффективный способ сделать это. У меня есть около 10 полей для заполнения, и 30 строк кода, чтобы сделать это, кажется смешным.

Я знаю, что мог бы создать вспомогательный метод для этого, но, безусловно, Apple или кто-то еще это уже рассмотрел? Есть ли более эффективный способ справиться с этим сценарием?

ответ

1

Просто FYI, вы можете использовать индексацию на NSDictionary. Вам не нужно выписывать objectForKey:.

Чтобы ответить на ваши явные вопросы:

  1. Я не думаю, что есть какой-либо вспомогательный метод для этого в общественном IOS SDK.
  2. Насколько я знаю, нет «более эффективного способа», чем написать вспомогательный метод или функцию.

Например, вы могли бы написать static inline функцию в файле .m, или вы могли бы добавить метод к классу, или вы могли бы написать категорию на UITextField, содержащий метод my_setTextSafely:, или вы могли бы написать категорию на NSDictionary, содержащий метод my_stringForKey:.

0

Вы можете использовать tenary оператор:

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

'results [@" name "]' всегда будет не нулем. – rmaddy

+1

@maddy, почему результаты [@ "name"] всегда будут nil? Если в словаре результатов не содержится ключ @ "name", он действительно должен возвращать нуль. –

+0

@ DuncanC Я сказал «не-ноль», а не «ноль». Вы не можете поместить 'nil' в' NSDictionary'. Как утверждает OP, он содержит объекты NSNull. Большая разница. – rmaddy

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

Если у вас есть контроль над именами ваших текстовых полей, вы можете назвать их после полей в словаре и использовать кодировку с ключом для написания нескольких строк магического кода. Например,

В вашем контроллере просмотра вы можете создать следующие текстовые поля.

@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 и ключ к методу ключей.

Смежные вопросы