2010-12-16 9 views
3

Мне сложно понять поток UITableViewController. В основном вот моя структура:heightForRowAtIndexPath всегда называется дважды

У меня есть tableViewController, который, конечно же, размещает tableView. И здесь я использую getCellContentView и cellForRowAtIndexPath для выполнения всей работы, связанной с моими ячейками. У моей ячейки несколько UILabels с собственными кадрами, по одному для каждой ориентации. Я обнаруживаю и выполняю все изменения ориентации и правильно перерисовывает рамку. Нет проблем. Все идет нормально.

Теперь мне нужна высотаForRowAtIndexPath, чтобы вернуть 100 для пейзажа и сказать 200 для портретной ориентации. Моя проблема заключается в том, что когда я NSLog внутри нее, метод вызывается дважды по какой-либо причине, когда я поворачиваю tableView. Кто-нибудь знает, почему метод дважды запускается при вращении? Я думал, что -reloadData может быть проблемой, и я подтвердил, что я вызывал -reloadData при вращении дважды как-то, но нет. Я вызываю -reloadData только один раз внутри метода willRotateToInterfaceOrientation и нигде в коде не вызывается (кроме внутреннего вызова viewDidLoad).

Почему высотаForRowAtIndexPath вызывается дважды в каждом событии поворота? Также кажется, что heightForRowAtIndexPath также не может правильно определить ориентацию при включении вращения. Я использую свойство ориентации панели состояния, чтобы проверить, что внутри heightForRowAtIndexPath возвращает соответствующую высоту ячейки. Любая помощь была бы потрясающей!

ответ

0

Кто заботится, сколько раз его называют :)

Вашей реализацией heightForRowAtIndex: должен быть достаточно быстрым, что вид таблицы может назвать его всякий раз, когда он хочет, и это не будет иметь значение.

Однако, если бы я должен был предположить, вращение происходит в два этапа (смотрите на didAnimateFirstHalfOfRotationToInterfaceOrientation:. И т.д. в документации UIViewController), вы понятия не имеете, что делается с помощью класса UITableViewController UIKit в течение rotatino - может быть, это освежает для вас?

Вы пробовали переопределить willRotateToInterfaceOrientation: что должно дать вам ориентацию, с которой вы вращаетесь, - можете ли вы использовать это, чтобы установить высоту ячейки, которую вы хотите?

Что-то вроде этого:

- (NSInteger)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return rowHeight; 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { 
    [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration]; 

    rowHeight = (UIInterfaceOrientationPortrait == interfaceOrientation) ? 100 : 200; 
    [tableView reloadData]; 
} 
+0

Г-н deanWombourne, я люблю тебя (предупреждение, непроверенных и напечатал из памяти!)! Работал! Теперь я читаю о внутренних функциях вращения, чтобы выяснить, почему таблица отображается дважды (как если бы выполнялись два вызова reloadData). – user511872 2010-12-17 08:17:38

Смежные вопросы