UITableViewCell из подпредставления contentView
Я создал ячейки с метками и используя checkaMarksAccessory. Несколько последних ячеек имеют UITextFields, которые могут изменять пользовательские настройки, а те имеют селектор на UIControlEventEditingDidEnd, где я хочу изменить состояние ячейки на проверенное.
Как я могу получить ячейку в селекторе? Разве у объекта нет родительского вида?
Способ, которым я вставляю объект в ячейку.
UITextField *textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 25, 200, 30)];
[textfield setBorderStyle:UITextBorderStyleRoundedRect];
[textfield addTarget:self action:@selector(vybavaDidFinishEdit:) forControlEvents:UIControlEventEditingDidEnd];
[cell.contentView addSubview:textfield];
2 ответа
Хорошо, так что использовать Superview. Суперпредставление является компонентом, которому принадлежит объект. Если я хочу получить UITableViewCell из UITextField, я использовал [[UITextField superview] superview].
Я не уверен, можно ли предположить cell.contentView.superview == cell
, Может Apple изменить это? Я сомневаюсь. Но я не вижу нигде в документации, где говорится, что представление содержимого ячейки является прямым представлением ячейки.
Если вы добавили UIGestureRecognizer
к одному из ваших подпредставлений представления содержимого ячейки, вы можете получить ссылку на ячейку с помощью:
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[gestureRecognizer locationInView:self.tableView]];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
Примеры использования кода в виде таблицы и анимации indexPathForRowAtPoint:
сюда.
Если вам нужно просмотреть суперпредставления, я думаю, что использование функции, подобной приведенной ниже, немного безопаснее.
UITableViewCell *ACMContentViewGetCell(UIView *view)
{
while ((view = view.superview)) {
if ([view isKindOfClass:[UITableViewCell class]]) {
return (UITableViewCell *)view;
}
}
return nil;
}
Но эта функция по-прежнему предполагает contentView
находится в пределах его cell
, который я также не видел нигде в документации.
Так что, возможно, лучшее решение - перестроить ваш код так, чтобы вам не нужно было cell
от contentView
или, если необходимо, добавьте переменную экземпляра из подпредставления contentView
в cell
,