2013-07-28 3 views
2

У меня были проблемы с искажением изображения моей ячейки, а после having it answered Затем я пошел реализовать решение, которое в основном состояло в сокращении высоты конкретных оскорбительных ячеек (которые автоматически добавляли к ним высоту). Я сделал это следующим образом:Почему использование numberOfRowsInSection вызывает бесконечный цикл в моем приложении?

- (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat standardHeight = 44.0; 

    if ([tableView numberOfRowsInSection:indexPath.section] == 1) { 
     standardHeight -= 2; 
    } 

    return standardHeight; 
} 

Однако каждый раз, когда я бег, я пойман в каком-то цикле выполнения, где приложение сохраняет отскакивая назад между первой линией этого метода и стартом, если пока он не выйдет из строя.

Видео: http://f.cl.ly/items/2F1E3r2A2p0y1b2j3R14/debug.mov

Однако, если я использую что-то вроде этого (один из ответов в предыдущей теме), кажется, работает:

- (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat rowHeight = 44.0f; 
    if (indexPath.row == 0) { 
     rowHeight -=1; 
    } 
    return rowHeight; 
} 

Что я делаю неправильно? Я просто не могу понять.

ответ

6

Проблема заключается в том, что вы не должны полагаться на один метод источника данных/делегата для предоставления данных другому. Что происходит в основном, так это то, что вы задаете свой tableView количество строк в разделе, когда вы должны получать эту информацию из своей модели (от которой должно быть получено numberOfRowsInSection:)

Все ваши datasource методы должны просто возвращать данные непосредственно из модели, так как ваш tableView может запросить ваш источник данных для данных в неожиданные моменты времени. Это справедливо не только для UITableView, но и для всех видов на основе данных, например, UICollectionView.

+0

Что вы подразумеваете, получив его от моей модели? В этом случае я создаю очень мало ячеек (два, максимум, обычно один), так как это таблица для отображения служб для входа в систему. Сейчас для входа в систему доступны только две службы, поэтому он просто выбирает, что показывать на основе того, на которые вы еще не вошли. https://gist.github.com/anonymous/cdc55c17de14c97d9441 Должен ли я переопределить эту логику в другой метод? :/ –

+0

очень интересное наблюдение @Cezar .. то, что вы сказали, имеет большое значение для меня в свете некоторых ошибок, с которыми я столкнулся в прошлом, которые я не мог объяснить. У вас есть официальная документация об этом или каком-то учебнике, в котором подчеркивается этот факт? Я дал вам свой +1, либо – abbood

+0

@DougSmith, который вы могли бы реализовать эту логику в другом методе и называть его как из таблицы: heightForRowAtIndexPath: 'и' numberOfRowsInSection'. Более того, вы могли бы вызвать этот метод, когда вы инициализируете свой «TableViewController» и сохраняете информацию об услугах, к которым пользователь еще не вошел в систему, в свой «TableViewController». – Cezar

1

Вместо вызова numberOfRowsInSection: метода из Tableview, вы можете сделать это:

if ([self tableView:tableView numberOfRowsInSection:indexPath.section] == 1) { 
    standardHeight -= 2; 
} 

Это будет безопасно, потому что только invocates своего собственного кода.

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