Подтвердить что ты не робот

IOS 8 Xcode6 heightForRowAtIndexPath называется дополнительным временем

Я только что загрузил Xcode6 Beta6 и обнаружил некоторые странные недостатки в своем приложении. После некоторой начальной отладки я обнаружил, что heightForRowAtIndexPath называется многочисленным дополнительным временем и вызывает некоторые неприятные эффекты.

Обычно я ожидал бы, что heightForRowAtIndexPath будет называться 2 раза больше, чем строки, которые я показываю. Поэтому, когда я hardcode numberOfRowsInSection возвращает 3, я должен видеть, что heightForRowAtIndexPath получает 5 раз. В iOS 7 это так, но когда я тестирую в Xcode6 Beta6, я вижу, что heightForRowAtIndexPath получает 7 раз. Когда я вернусь 4, метод получится вызванным 9, 5 и его 11. Итак, кажется, что шаблон в два раза больше количества строк, которые я жестко кодирует + 1.

Кто-нибудь еще столкнулся с этой проблемой или нашел способ ее решить? Просто быть в состоянии подтвердить, что это ошибка iOS была бы огромной помощью, потому что тогда я могу отложить дефект на потом, так как Apple может самостоятельно решить эту проблему.


Изменить: Эта проблема все еще существует в Xcode 6 GM


Изменить 2: Apple ответила и закрыла мой отчет об ошибке, вот ответ:

Контракт API делегата заключается в том, что мы можем назвать этот метод настолько, насколько нам нужно.

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

4b9b3361

Ответ 1

iOS 8, Apple изменила способ определения размера содержимого табличного представления. Это необходимо для дальнейшего его оптимизации и обеспечения большей динамичности в дизайне таблиц.

Как часть этого, теперь они больше не вызывают путь heightForRowAtIndex для всех строк одним выстрелом, вместо этого они просто назовут его столько раз, сколько они хотят, чтобы определить размер содержимого. Определение размера содержимого также было сделано как динамическое, следовательно, несколько вызовов.

Не выполняйте вычисления высоты внутри метода heightForRowAtIndexPath. Вместо этого напишите частный метод и рассмотрите его как heightForRowAtIndexPath прошлого. Храните все высоты в словаре по отношению к объекту NSIndexPath в качестве ключа.

Конечно, это означало бы вызвать этот частный метод перед вызовом reloadData, если данные были изменены.

Ответ 2

Для меня динамическая высота пользовательского tableViewCells вызывала определенную проблему, определяющую методы heightForRowAtIndexPath и valuHeightForRowAtIndexPath. Один работал идеально подходит для iOS 7, а другой для iOS 8. Решил его, условно проверяя версию iOS.

EDIT:. Поскольку мы должны были поддерживать как iOS 7, так и 8, с бета-версией Xcode6 и нашим представлением на следующий день, этот ответ был решением для меня в середине 2014 года. Если downvoting, пожалуйста, учтите причину.