Как получить значение UITextField в NSString, который находится в UITableViewCell? - PullRequest
0 голосов
/ 27 апреля 2018

Я установил UITextField в UITableViewCell. Загрузите UITableView согласно количеству массивов. Все текстовые поля доступны для редактирования. Но я хочу, чтобы при редактировании UITextField данные UITextField сохранялись в предопределенную NSString. Для каждого текстового поля IndexPath.row есть разные строки.

Прикрепление моего кода, который я использовал для генерации NSMutableArray ...

[arrProfile removeAllObjects];
 arrProfile = [[NSMutableArray alloc] initWithObjects:
              @{@"title": @"CUSTOMER NAME", @"details": strFName},
              @{@"title": @"EMAIL ID", @"details": strEmail},
              @{@"title": @"MOBILE NO.", @"details": strContact},
              @{@"title": @"STATE", @"details": strStateName},
              @{@"title": @"CITY", @"details": @""},
              nil];

[_tblProfile reloadData];

Теперь присоединение кода, используемого в cellForRowAtIndexPath ...

static NSString *cellIdentifier = @"cellProfile";

NSDictionary *dictProfile = [arrProfile objectAtIndex:indexPath.row];
ProfileTableViewCell *cell = (ProfileTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

cell.lblTitle.text = [dictProfile objectForKey:@"title"];
cell.txtDetails.text = [dictProfile objectForKey:@"details"];

cell.txtDetails.delegate = self;
[self textFieldShouldReturn:cell.txtDetails];
[self textFieldShouldBeginEditing:cell.txtDetails];

return cell;

Ответы [ 4 ]

0 голосов
/ 07 мая 2018

1. Вы можете попробовать использовать функцию добавления блока в ячейку, но теперь следует блок кода:

cell.m_textChangeBlock = ^(NSString *text) {
    if(indexPath.row){
        weakSelf.m_models[indexPath.section].rtext = text;
    }else{
        weakSelf.m_models[indexPath.section].ltext = text;
    }
};
0 голосов
/ 27 апреля 2018

Вариант 1:

Это соответствует вашей реализации Присвойте индекс ячейки txtDetails.tag при создании строки ячейки (cellForRowAtIndexPath). Это поможет вам в определении строки вашего текстового поля

txtDetails.tag = indexPath.row

Реализация делегата UITextField textFieldDidEndEditing ИЛИ shouldChangeCharactersIn до

  1. Получить значение поля.
  2. И индекс строки

    arrProfile [textField.tag] = "новое значение"

Вариант 2:

Определение протокола для получения обновлений текста в ячейке

protocol  MYCellDelegate: class {
    textFieldDidChange(row: Int, string: String)
}

class MyCell: UITableViewCell {
    weak var delegate:  MYCellDelegate?
    var row: Int
}

В вашем cellForRowAtIndexPath выполните следующее

cell.delegate = self
cell.row = indexPath.row

Реализация UITextFieldDelegate в ячейке (textFieldDidEndEditing ИЛИ shouldChangeCharactersIn)

и вызов textFieldDidChange(row: Int, string: String) с соответствующими значениями

Не забудьте удалить следующие строки из cellForRowAtIndexPath

[self textFieldShouldReturn:cell.txtDetails];
[self textFieldShouldBeginEditing:cell.txtDetails];
0 голосов
/ 27 апреля 2018
cell.txtDetails.delegate = self;
cell.txtDetails.tag = indexPath.row;
[cell.txtDetails addTarget:self action:@selector(textFieldDidEndEditing:) forControlEvents:UIControlEventTouchUpInside];



-(void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField.tag == 0) {
        strFName = textField.text;
    } else if (textField.tag == 2) {
        strContact = textField.text;
    }
    [self loadTheMainArray];
}
0 голосов
/ 27 апреля 2018

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

Вы можете сделать это, используя Tag для текстового поля. Вы правильно поняли !. В методе ячейки таблицы укажите для каждого текстового поля уникальный тег (вы можете использовать indexpath.row) для этой цели. Назначьте делегата здесь. Методы делегата Textfield будут запущены. Теперь из методов текстового поля делегата снова на основе тега получить ввод из текстового поля в виде строки и сохранить.

Примечание:

[self textFieldShouldReturn:cell.txtDetails];
[self textFieldShouldBeginEditing:cell.txtDetails];

Методы, которые не требуется вызывать из tableview cellForRowAtIndexPath. Делегат Textfield, если вы назначите его, он позаботится об этом.

...