почему beginUpdates не изменяет размер моей ячейки в UITableView?

что у меня есть:

UITableView с ячейкой. Эта ячейка имеет UITextView в качестве подпредставления. Все делегаты и источники данных установлены правильно. Высота ячейки правильно получена из heightForRow и т. д. Пользователь вводит текст в textView.

что я пытаюсь сделать:

Я хочу, чтобы ячейка обновляла свою высоту по мере ввода пользователем БЕЗ отказа от textView в качестве первого ответчика. Во многих сообщениях на stackOverflow говорится, что для этого работает пустое поле beginUpdates/endUpdates.

Что я пробовал:

1- Я вызвал beginUpdates и endUpdates (для tableView) внутри textViewDidChange. Ничего не случилось. (примечание: все делегаты установлены правильно).

2- Я даже вызвал beginUpdates и endUpdates внутри textViewDidEndEditing, чтобы убедиться (чтобы убедиться, что это работает после того, как textView уходит в отставку в качестве первого респондента). Это работает (размер ячейки изменяется, когда textView уходит в отставку как firstResponder).

3- Затем я попытался перезагрузить данные внутри textViewDidChange. Это работает, за исключением того, что он отказывается от textView в качестве первого ответчика (клавиатура исчезает при каждом вводе символа).

4- Затем я попытался перезагрузить данные, а затем напрямую сказал textView снова стать первым ответчиком (чтобы клавиатура оставалась включенной). Это работает, но это приводит ко многим проблемам с положением курсора и автокоррекцией и возвратом в textView.

5- Затем я попытался перезагрузить данные, а затем вернул NO в textViewShouldEndEditing, когда я хотел, чтобы клавиатура оставалась поднятой, но по какой-то причине ячейка не обновляла свою высоту.

6- Наконец, я попробовал reloadRowsAtIndexPaths и т. д., а затем вернул NO в textViewShouldEndEditing, но это дало мне ошибку, говорящую о том, что он не может удалить объект, который отказывается resignFirstResponder.

Я также пробовал такие методы, как reloadInputViews и setNeedsDisplay, setNeedsLayout и т. д. внутри textViewDidChange, но ничего не происходит.

Мой вопрос:

Мне кажется, что № 2 предполагает, что ячейка не может обновлять свою высоту, пока одно из ее подвидов является первым ответчиком. Так ли это? Есть ли документация по этому поводу (я не нашел)?

Почему не работают beginUpdates/EndUpdates? Известны ли или распространены случаи, когда это не работает? Может быть что-то не так с тем, как я настраиваю вещи? Но изменение размера отлично работает с № 3 и № 4 (указывая на то, что все мои методы делегата и т. Д. Установлены правильно).

Извините за очень длинный вопрос, но может ли кто-нибудь дать какие-либо идеи, кроме тех, которые я разместил? У меня такое чувство, что это какая-то ОЧЕНЬ глупая и очевидная вещь, которую я упускаю (как обычно)...

Кстати, я использую и симулятор iOS, и реальный iPhone с 5.1.


person Cashew    schedule 06.09.2012    source источник
comment
эта ссылка в основном сообщает, что UITableView не поддерживает изменение размера ячеек в реальном времени (поскольку пользователь вводит текстовое представление, которое является подвидом ячейки). Должен ли я просто попробовать использовать UIScrollView или кто-нибудь знает способ сделать это в UITableView?   -  person Cashew    schedule 06.09.2012
comment
Вы указываете новую высоту в методе делегата cellHeightForRowAtIndexPath: табличное представление, вы реализовали этот метод?   -  person Zhang    schedule 06.09.2012
comment
Да, я реализовал этот метод, и № 3 и № 4 показывают мне, что метод работает правильно...   -  person Cashew    schedule 06.09.2012


Ответы (1)


Он отлично работает в моем маленьком демонстрационном приложении. Обратите внимание, что код получает сообщение делегата textView, устанавливает высоту ivar, которая применяется к каждой ячейке, затем вызывает начало/конец — все ячейки становятся больше при каждом нажатии символа:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Asked for Height");
    return height;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSLog(@"Text");
    height += 10;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    return YES;
}
person David H    schedule 06.09.2012
comment
это действительно самая странная вещь... ваш код отлично работает, и я сделал свое собственное демонстрационное приложение, чтобы попробовать его, и оно РАБОТАЕТ! - person Cashew; 06.09.2012
comment
что-то должно быть не так в моем текущем приложении... Кажется, мне нужно переписать некоторые части или переделать его с нуля. В любом случае, спасибо за доказательство того, что beginUpdates работает! Ошибка в моем приложении... - person Cashew; 06.09.2012
comment
у вас есть какие-либо идеи, что я должен проверить, кроме делегатов для tableView и textView и tableView dataSource? - person Cashew; 06.09.2012
comment
Я только что нашел настоящую причину, почему это не сработало. По какой-то причине текст, полученный из textView для расчета высоты, НЕ обновляется. Очень извиняюсь за этот ненужный пост. Я должен был перепроверить свою работу. Большое спасибо! - person Cashew; 06.09.2012