#iphone #objective-c #uitextfield #nsobject
#iPhone #objective-c #uitextfield #nsobject
Вопрос:
моя проблема в том, что у меня есть экран с большим количеством UITextField и class, где все данные, введенные в UITextField, хранятся в моем классе xyz. Прямо сейчас я сопоставляю свое UITextField со свойствами класса, используя switch case, который намного ужасен, не говоря уже о проверке, которая добавляет ему больше сложности. Есть ли какой-либо способ сопоставить свойство класса с UITextField и избавиться от случая переключения, пожалуйста, помогите.
Комментарии:
1. Кажется, вы ищете
IBOutlet
s2. 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
)