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,

Другие вопросы по тегам