Аксессуар UITableView исчезает во второй половине UITableView

У меня есть приложение для iPad (XCode 4.6, ARC, Storyboards, iOS 6.2.3). У меня есть UIPopover с UITableView, в котором есть 21 строка. Я могу установить accessoryType во всех строках случайным образом, но только в первых 12 строках параметр accessoryType (флажок) сохраняется, поэтому его можно проверить другим методом и обработанный. Я не вижу никакой разницы между первыми 12 строками и последними 9 строками. UITableView прокручивается, поэтому, чтобы перейти к строкам после 11-й строки, вам нужно прокрутить вниз.

Вот код для установки accessoryType:

#pragma mark didSelectRowAtIndexPath

- (пусто) tableView:(UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {

    //  get the cell that was selected
    UITableViewCell *theCell = [tableView cellForRowAtIndexPath:indexPath];

    if(theCell.accessoryType != UITableViewCellAccessoryCheckmark)
        theCell.accessoryType = UITableViewCellAccessoryCheckmark;
    else
        theCell.accessoryType = UITableViewCellAccessoryNone;
}

Вот код, в котором я проверяю accessoryType и обрабатываю его:

-(void) moveServices  {  //  (moves checked tableViewRows to services tableview)

NSMutableString *result = [NSMutableString string];

for (int i = 0; i < [servicesArray count]; i++) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
    [tvServices scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO];

    UITableViewCell *cell = [tvServices cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        [result appendFormat:@"%@, ",cell.textLabel.text];
    NSLog(@"\n\ni: %d\ncell.accessoryType: %d\ncell.textLabel: %@",i,cell.accessoryType, cell.textLabel);
    }
}

if (result.length > 2) {  //  move to text box in main menu
    storeServices =[result substringToIndex:[result length] - 2];
}

}


person SpokaneDude    schedule 17.07.2013    source источник


Ответы (1)


Похоже, вы смешиваете понятие «источник данных» и содержимое ячеек в таблице. Не делайте этого - держите источник данных (независимо от того, должна ли конкретная строка в таблице отображать галочку на основе логики вашей программы) отдельно от настроек конкретных ячеек (независимо от того, отображается ли конкретная ячейка с галочкой). Затем в cellForRowAtIndexPath вы строите ячейку в соответствии с текущими настройками вашего источника данных. Причина в том, что UITableView повторно использует экземпляры ячеек в зависимости от того, какие строки видны на экране (и это просто хороший дизайн MVC).

В вашем случае вы должны сохранить свойство NSMutableArray в своем классе, которое записывает настройки для всей таблицы, и использовать значение из этого массива в cellForRowAtIndexPath для настройки этой конкретной ячейки. Затем другие методы «бизнес-логики» в вашем контроллере используют свойство массива для запроса состояния вашей модели вместо настроек ячейки (которые являются частью представления и должны быть независимыми от модели данных).

person Bogatyr    schedule 17.07.2013
comment
Тогда почему это работает для первых 12 строк, а не для остальных строк? - person SpokaneDude; 17.07.2013
comment
Это работает только по счастливой случайности. Потому что эти 12 строк являются (в настоящее время) видимыми, и поэтому UITableView создал для них ячейки. Как только вы прокрутите вниз достаточно далеко, диапазон строк, для которых это работает, изменится. Вот почему вы этого не делаете. Держите источник данных отдельно от вашего представления, так спроектирован UITableView, следуйте этому, и все будет хорошо. - person Bogatyr; 17.07.2013
comment
ОК... Я точно понимаю, что вы говорите... однако я не знаю, что мне нужно изменить в моем коде, чтобы учесть ваше предложение. Можете ли вы указать мне пример или документ? - person SpokaneDude; 17.07.2013
comment
Я нашел это, что точно объясняет, что мне нужно делать. , Мне нужно сохранить массив со статусом каждой строки... - person SpokaneDude; 17.07.2013