2010-02-25 2 views
0

У меня возникла проблема. Обычно, имея дело с UITableView, я создам специальный метод , configureCell, который строит ячейки, поскольку tableView нуждается в них. Поэтому cellForRowAtIndexPath запрашивает configureCell для получения новой ячейки, если в кэше не найдено ни одного.UITableView с единой пользовательской ячейкой? (iPhone)

В части cellForRowAtIndexPath, что вызывается каждый раз, когда пользователь прокручивает:

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
     static NSString *CellIdentifier = @"Cell"; 

     UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) {  
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
      [self configureCell:cell atIndexPath:indexPath]; 
     } 
//this part is always executed! 
} 

я установить значение меток и т.д. из моей модели. Это прекрасно работает, и я считаю, что это должно быть правильно работать и быть наименее напряженным для процессора. Из того, что я могу прочитать в TableView Guide.

Моя проблема в том, что первая ячейка в моем таблицеView отличается от остальных. У меня есть специальная иконка и другие вещи, которые отделяют ее от других ячеек.

В моем конфигурировании камеры я потом пытался спрашивать:

if (indexPath.row == 0) { 

    //do special setup! 

} 

Это плохая идея, так как ленивая нагрузка Tableview клетки и, следовательно, первая ячейку, которая находится за пределами экрана, когда время прокручивается на экране, также получит indexPath.row = 0, так что теперь у меня есть «специальная ячейка» для каждых 7 ячеек. Как мне обойти эту?

Вторая проблема, которая также возникает из-за вышеизложенного: у меня есть таможня UIView, размещенная во всех ячейках accessoryView. Когда пользователь нажимает кнопку «Изменить», все элементы аксессуаров cells должны появляться на значке, указывающем, что мы находимся в «режиме редактирования». Здесь, опять же, это происходит только для ячеек на экране, когда прокрутка «старых» ячеек вызывается из кеша или создаются новые ячейки, которые не знают, что мы находимся в режиме редактирования.

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

Я думаю, я спрашиваю; следовать лучшей практике, а не бороться с SDK, что мне делать, чтобы получить желаемую функциональность и на каком этапе жизненного цикла Cell я должен применить эту логику?

Надежда кто-то может вести меня в правильном направлении :) спасибо заранее :)

+0

Какой стиль TableViewController вы используете? –

+0

Ahh не видел вашего вопроса там Роб. Это UITableView, который я вручную добавил в UIViewController. Он не использует разделы. вот так: self.tableView = [[[UITableView alloc] initWithFrame: self.view.bounds] autorelease]; Ответит ли это на ваш вопрос? – RickiG

+0

Просто сменил его на: \t self.tableView = [[[UITableView alloc] initWithFrame: self.view.bounds style: UITableViewStylePlain] autorelease]; Уверен :) – RickiG

ответ

1

Я думаю, что проблема заключается не в том, что первая ячейка вне экрана находится на indexPath.row = 0. Проблема в том, что вы используете тот же CellIdentifier для обычных и настраиваемых ячеек. Поэтому, когда TableView переходит к деактивации кэшированной ячейки, она иногда захватывает вашу пользовательскую ячейку, в которой есть значок.

Поскольку вы дали ему тот же CellIdentifier, что и ваши обычные ячейки, он не знает, что они не совпадают.

Что-то, как это должно исправить:

static NSString *CellIdentifier; 
if([indexPath row] == 0){ 
    CellIdentifier = @"CustomCell"; 
} else { 
    CellIdentifier = @"Cell"; 
} 

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

+0

Да, в ретроспективе, я также вполне уверен, что это произошло. Подход if (indexPath.row == 0) правильный. Правильный путь для создания пользовательской ячейки для первой строки и использования другого идентификатора. – RickiG

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