Управление делегатом UITextFields в настраиваемом UITableViewCell

Итак, я немного осмотрелся, и ничего здесь не объясняет, как это сделать. У меня есть 7 полей UITextFields в пользовательском UITableViewCell.

У меня такой вопрос: как правильно управлять делегатом этих UITextFields?

Поскольку пользовательские ячейки технически являются частью «модельной» части проекта, я бы предпочел, чтобы контроллер, управляющий UITableView, также управлял текстовыми полями в ячейках таблицы, но я не могу понять, как установить делегата для текстовые поля (которые создаются в подклассе UITableViewCell) для этого контроллера представления.

Было бы плохой практикой просто привести подкласс UITableViewCell в соответствие с делегатом UITextField и управлять всем этим там? Если да, то как еще мне это сделать?

Спасибо, любая помощь будет принята с благодарностью.


person Ahab    schedule 16.07.2012    source источник


Ответы (5)


У вас не должно возникнуть проблем с настройкой делегата текстового поля ячейки в качестве контроллера представления.

Вот что вам нужно сделать:

1) Контроллер представления должен реализовать протокол UITextFieldDelegate

2) Объявите свойство текстового поля в настраиваемой ячейке.

@property (nonatomic, retain) IBOutlet UITextField *textField;

3) Затем установите контроллер представления в качестве делегата текстового поля в методе cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";

    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) 
    {  
        // use this if you created your cell with IB
        cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil] objectAtIndex:0];   

        // otherwise use this  
        cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 


        // now set the view controller as the text field delegate  
        cell.textField.delegate = self;
    }

    // configure cell...

    return cell;
}
person Eyal    schedule 17.07.2012
comment
Спасибо!! Работал на меня - person Marcelo Gracietti; 13.12.2016

На мой взгляд, ячейка должна управлять клавиатурой, поскольку именно она содержит UITextField. Вы можете установить свою ячейку в качестве делегата UITextField. В моем собственном приложении я сделал это, а затем заставил мою ячейку иметь собственного делегата. Любой из методов UITextField или любых новых методов, которые должны обрабатываться контроллером, можно передать контроллеру через делегат ячеек.

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

person Jamie    schedule 17.07.2012
comment
Я согласен. Для этого просто установите делегата при инициализации вашей реализации UITableViewCell. Например, в вызове awakeFromNib просто добавьте self.YourTextField.delegate = self. - person JeffB6688; 14.04.2017

Мое предложение заключалось бы в том, чтобы «пометить» (т.е. установить тег) каждого textField со значением, которое кодирует раздел, строку и одно из семи текстовых представлений в таблице, а затем сделать UIViewController делегатом.

Поэтому вам нужно ограничить их размер - скажем, у вас никогда не будет больше 100 строк. Итак, вы кодируете это как:

.tag = 1000 * раздел + 100 * строка +

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

person David H    schedule 16.07.2012

Чтобы объявить ваш TableViewController в качестве делегата, включите <UITextFieldDelegate> в конце вашего @interface в файле .h TableViewController.

@interface MyTableViewController : UITableViewController <UITextFieldDelegate>

Затем соедините текстовые поля, перетаскивая каждое поле под @interface. Каждый UITextField связан с соответствующим свойством посредством IBOutlet. Наконец, в файл .m включите следующую функцию, чтобы показать делегату, какое поле вы хотите вернуть ...

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [aTextField resignFirstResponder];
    return YES;
}
person Community    schedule 16.07.2012

Быстрая версия (на основе ответа Эяля)

class MyViewController: UIViewController, ... , UITextFieldDelegate {

    @IBOutlet var activeTextField: UITextField!  //doesn't need to connect to the outlet of textfield in storyboard

    ....

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    ....

    var cellTextField = self.view.viewWithTag(101) as? UITextField
    cellTextField!.delegate = self;
    ....
}
person oOEric    schedule 01.09.2015