2013-06-04 1 views
0

Я разрабатываю приложение, которое должно динамически генерировать компоненты пользовательского интерфейса на основе данных, возвращаемых с сервера. я достиг динамического макета путем формирования UILabels, UITextFields, UIPickerViews и т.д. динамически в коде Eg:Как получить данные из динамически созданного UITextField s?

for(int i=0; i < count; i++) 
{ 
    UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 300, 30)]; 
    txtField.placeholder = [@"Test Input" ]; 

    [self.view addSubview:txtField]; 
} 

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

Спасибо, cybervedaa

+4

Вы действительно хотите создать несколько текстовых полей с точно таким же фреймом? –

ответ

2

Внедрение <UITextFieldDelegate>. Сделайте себя делегатом от txtField. Установите tag из txtField. Затем, когда вы получаете обратный вызов до textFieldDidEndEditing: или, возможно, textField:shouldChangeCharactersInRange:replacementString:, вы можете указать, какое текстовое поле было изменено и что-то сделать.

+0

Я считаю, что вы должны иметь возможность «сопоставить текстовое поле с переменной в объекте модели» с помощью метода textFieldDidEndEditing: ', который предлагает @Wain. Затем, когда вам нужно использовать то, что находится в текстовом поле, посмотрите на то, что вы сопоставили с ним в своей модели. По крайней мере, я уверен, что это лучший способ сделать это. – GeneralMike

0

Если это динамически дать каждому TextField уникальный тег, а затем использовать его для извлечения значения из него.

UITextField *textField = [self.view viewWithTag:uniqueTag]; 
2

Чтобы ссылаться на мнения, которые вам нужно как-то ссылаться на них. Например, при использовании построителя интерфейсов представления ссылаются через свойства вашего класса, указанные с помощью IBOutlet. Поскольку вы создаете эти представления в цикле, я рекомендую вам пометить каждое представление и получить их с помощью viewWithTag:. Будьте осторожны с другими представлениями, имеющими по умолчанию тег 0, поэтому увеличьте индекс, чтобы сохранить значение уникальным.

for(int i=0; i < count; i++) 
{ 
    UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 300, 30)]; 
    txtField.placeholder = [@"Test Input" ]; 
    txtField.tag = i + 1; 

    [self.view addSubview:txtField]; 
} 

//To retrieve elsewhere 
UITextField *txtField = [self.view viewWithTag:index]; 
Смежные вопросы