У меня есть UITableView
, в каких ячейках содержится один UITextField
. Мой UITableViewController
является делегатом всех этих текстовых полей. Теперь, когда UITableViewController
получает освобождение, я хочу установить делегат всех этих текстовых полей на нуль. Текстовое поле имеет тег, поэтому я могу получить его по тегу, когда у меня есть ячейка.UITableViewCell: установите делегат UITextField на nil в dealloc
Вопрос в том, как получить все созданные ячейки? Запрашивая UITableView
для visibleCells
возвращает только видимые ячейки, но может случиться, что есть строка, которая не видна, бит ее по-прежнему имеет UIViewController
в качестве делегата. Поэтому мне действительно нужно как-то собрать все созданные ячейки. cellForRowAtIndexPath
делает то же самое, поэтому для меня это тоже не сработает. Единственный способ, который я вижу здесь, - хранить все текстовые поля в массиве, но может быть, есть лучший способ?
Вот код:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"reuseId"];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"reuseId"];
UITextField *nameTextField = [[UITextField alloc] initWithFrame:nameTextFieldRect];
nameTextField.tag = TEXT_FIELD_TAG;
nameTextField.delegate = self;
[cell.contentView addSubview:nameTextField];
}
return cell;
}
-(void)dealloc
{
// todo: get all text fields and set theirs delegate to nil
}
Ну, большинство ответов свидетельствуют о том, что мне не нужно, чтобы установить делегат ноль, но, как я параноик, я подозреваю, что следующий сценарий возможно: Вызов кнопки «Назад», так вызывается dealloc
моего view controller
. В dealloc
мой view controller
выпускает табличный вид, но tableView
все еще существует на этом этапе, а также все текстовые поля. И если каким-то образом одно из текстовых полей будет называть его методом делегирования, приложение будет разбиваться, потому что делегат больше не является допустимым объектом.
Если кто-то может объяснить, почему этот сценарий невозможен, он убедит меня, что мне не нужно устанавливать делегат на нуль.
Вы создали пользовательскую ячейку для просмотра таблиц? – user3182143
Как насчет того, чтобы ваши делегаты 'textField' были в nil, в 'prepareForReuse'? Таким образом, только видимые ячейки будут иметь своих делегатов, установленных в контроллере табличного представления. – n00bProgrammer
нет необходимости делать это, по умолчанию делегаты имеют слабую ссылку на ячейку, после того как 'UITableViewController' освобожден, все ячейки также освобождены, а делегаты автоматически установлены на nil –