UITableView accessoryType изчезва в последната половина на 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

- (void) 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