Сопоставление UITextField со свойством класса

#iphone #objective-c #uitextfield #nsobject

#iPhone #objective-c #uitextfield #nsobject

Вопрос:

моя проблема в том, что у меня есть экран с большим количеством UITextField и class, где все данные, введенные в UITextField, хранятся в моем классе xyz. Прямо сейчас я сопоставляю свое UITextField со свойствами класса, используя switch case, который намного ужасен, не говоря уже о проверке, которая добавляет ему больше сложности. Есть ли какой-либо способ сопоставить свойство класса с UITextField и избавиться от случая переключения, пожалуйста, помогите.

Комментарии:

1. Кажется, вы ищете IBOutlet s

2. nielsbot правильно понял мой вопрос / проблему

3. Вы ищете что-то в строках привязок Cocoa?

4. несколько, но привязки cocoa недоступны на iPhone (поправьте меня, если ошибаюсь)

5. Да, его там нет, но я пытался понять ваше требование.

Ответ №1:

Вы могли бы рассмотреть класс, который принимает UITextFieldDelegate протокол и содержит строку.

 @interface XXBoundString: NSObject <UITextFieldDelegate> {
    NSString *string;

    ... // Other necessary ivars
}

... // string methods that you want exposed
@end
  

Таким образом, вы можете поместить весь код в этот объект. Если методы проверки отличаются для каждого текстового поля, вы можете принять код как блочный объект.

 -(void)setValidationBlock:(ValidationBlock)block;
  

Здесь вы должны заменить NSString s на XXBoundString objects и назначить каждому из них делегат определенного UITextField.

Ответ №2:

Присвоите каждому текстовому полю тег от 0 до n. Затем вы можете использовать массив для сопоставления тегов просмотра с выход имена свойств, например:

 @interface MyClass

@property ( nonatomic, retain ) id property1 ;
@property ( nonatomic, retain ) id property2 ;
@property ( nonatomic, retain ) id property3 ;

@end
  

Затем в вашем -(void)textFieldDidChangeText:(NSNotification*)note (или где бы вы ни обрабатывали изменения в текстовом поле) методе сделайте это:

 static NSString * fieldNames[] = { @"property1", @"property2", @"property3" } ;
UITextField * field = [ note object ] ;
[ self setValue:field.text forKey:fieldNames[ field.tag ] ] ;
  

Может быть, кто-то другой может предложить более надежное решение. HTH

Комментарии:

1. верно, в основном проблема заключается в непосредственном сопоставлении текстового поля со свойством и, как таковое, добавляет необходимость в массиве строк : ( и неправильный индекс может привести к повреждению.

2. Вы могли бы добавить это: assert field.tag > 0 amp;amp; field.tag < (sizeof(fieldNames)/sizeof(fieldNames[0])) 🙂

3. Кроме того, в этом случае я бы назначил tag локальной переменной, чтобы избежать вызова field.tag 3x. ( NSInteger tag = field.tag )