Как работать с UITextFields внутри UITableViewCells? - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть 10 UITableViewCells в моем UITableView. Каждая ячейка имеет UITextField. Они загружаются нормально, но мне нужен способ установить текст каждой ячейки в соответствующей строке.

Есть ли делегат UITextField, который я могу использовать для этого, и как я могу определить, какому текстовому полю принадлежит NSString и т. Д.?

Edit:

Вот фотография моего tableView. Я хочу, чтобы он загружал текст в каждую ячейку textfield с сервера, чтобы пользователь мог редактировать его. Или, если на сервере нет данных, textfield будет пустым, и пользователь сможет добавить данные и выполнить синхронизацию.

Я создал NSString для каждой ячейки, например temperatureString, pulseString и т. Д.

enter image description here

Ответы [ 5 ]

0 голосов
/ 22 ноября 2011

Вы должны установить текст в tableView: cellForRowAtIndexPath:

Похоже, у вас есть определенный порядок, в котором вы хотите, чтобы ваши элементы появлялись, в котором было бы неплохо использовать NSArray вместо NSDictionary.

Вы можете в init или initwithNibName создать свойство сохраненного массива:

self.myListArray = [NSArray arrayWithObjects:@"fever", @"cough", @"runny nose", nil];

Тогда, предполагая, что у вас есть только 1 раздел, вы должны сделать cell.textField.text = [self.myListArray objectAtIndex:indexPath.row];

Есть ли причина, по которой вы используете NSDictionary для этого, а не NSArray?

0 голосов
/ 22 ноября 2011

Исходя из вашего комментария в ответ на @Javy (который содержит дополнительную информацию, которую вы должны рассмотреть, добавив к исходному вопросу), вы можете сделать что-то вроде следующего:

UITableViewCell *cell = nil;
NSString *key = nil;

switch (indexPath.row)
{
    case 0:
        cell = self.temperatureCell;
        key = @"temperature";
        break;
    case 1:
        // Do other cases similarly ...
}

NSString *text = [self.childAppointmentDictionary objectForKey:key];
cell.textField.text = text;
0 голосов
/ 22 ноября 2011

Редактировать: Что касается новой информации, это мое новое решение

Так что, судя по всему, вы вставляете UITextField в каждую ячейку, вместо того, чтобы устанавливать тег для каждой ячейки, установите тег длякаждый UITextField

Сначала определите свои теги

#define DESCRIPTIVE_TAG_VALUE_1 10
#define DESCRIPTIVE_TAG_VALUE_2 11
#define DESCRIPTIVE_TAG_VALUE_3 12
...

Используйте их в своем UITextField Делегате, чтобы определить, к какому UITextField принадлежит, к какому NSString, то есть, если вы синхронизируете скаждое обновление, если нет.Затем получите ссылку на UITableView и извлеките каждое из текстовых значений каждого подпредставления ячейки, тег которой равен одному из ваших определений (снова в операторе switch).

Еще раз, когдаработая с iOS, используйте теги, они ваши друзья

ИЛИ

Также вы сказали, что у вас есть ссылка на каждый NSString, вы можете просто хранить ссылку на каждый UITextField вместо того, чтобыТаким образом, когда вы синхронизируете, вам просто нужно отойти от каждой из ваших UITextField ссылок.

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

0 голосов
/ 22 ноября 2011

UITextfield - это подкласс UIView, у которого есть свойство 'tag'.Вы можете назначить indexPath.row ячейки как тег ее текстового поля в качестве идентификатора.

0 голосов
/ 22 ноября 2011

Вы должны хранить ссылку на каждое текстовое поле при его создании, поэтому в:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

Метод, вы бы добавили эту строку:

[myTextFieldArray addObject: cell.textField];

Предполагается, что textField является свойством для пользовательской ячейки табуляции.

Вы также можете установить текст в текстовом поле сразу после метода if (cell == nil).

Методы делегата просто позволяют вам знать, когда печатается текст и т. Д.

EDIT:

Учитывая то, что вы добавили, я согласен с Сидом и CStreel. Создайте теги для каждого значения:

#define kTemperatureTag 0
#define kPulseTag 1
// etc.

В качестве альтернативы CStreel я бы назначал / извлекал информацию, соответствующую строке indexPath, и не беспокоился о назначении тегов, потому что они будут одинаковыми, если вы начнете свои теги с нуля.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  // setup / retrieve cell

  NSInteger index = [indexPath row];
  switch(index)
  {
  case kTemperatureTag:
    cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];
            break;
  // case ...
  }
  // ..
}

И

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
  NSInteger index = [indexPath row];
    switch(index){
        case kTemperatureTag:
          [self.childAppointmentDictionary addObject:cell.textField.text forKey:@"temperature"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...