Есть ли способ вставить строки в TableView со статическими ячейками, настроенными через раскадровку?

У меня есть TableView, который я создал в раскадровке с помощью статических ячеек.

Идея состоит в том, что раздел имеет одну строку с меткой и переключателем. Когда пользователь нажимает переключатель «Вкл», в разделе появляются новые строки ниже. Несколько похоже на настройки Wi-Fi в приложении «Настройки» (которое добавляет новые разделы, но я добавляю новые строки).

введите здесь описание изображения

Я создаю этот TableView через раскадровку так:

введите здесь описание изображения

А теперь действие, выполняемое при изменении значения переключателя:

- (IBAction)hitSwitch:(id)sender {

    NSArray *indexPathsArray = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:1 inSection:0], [NSIndexPath indexPathForRow:2 inSection:0], nil];



    UISwitch *theSwitch = sender;

    [self.tableView beginUpdates];

    if (theSwitch.on) {

        [self.tableView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationAutomatic];

    } else {

        [self.tableView deleteRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationAutomatic];

    }

    [self.tableView endUpdates];

}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if (self.addRowsSwitch.on) {

        return 3;

    } else {

        return [super tableView:tableView numberOfRowsInSection:section];

    }

}



- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (!self.addRowsSwitch.on) {

        return [super tableView:tableView cellForRowAtIndexPath:indexPath];

    } else {

        UITableViewCell *newCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

        return newCell;

    }

}

Но согласно моему удобному отладчику, tableView:numberOfRowsInSection: вызывается, возвращает значение, а затем приложение падает до вызова tableView:cellForRowAtIndexPath.

2012-08-02 13:16:08.564 TableViewInsertTest[3186:f803] * Завершение работы приложения из-за необработанного исключения "NSRangeException", причина: "* -[__NSArrayI objectAtIndex:]: индекс 1 за пределами [ 0 .. 0] *** Первый стек бросить вызов: (0x14b2022 0xeb2cd6 0x149e644 0x43bea5 0x2481a8 0x1f3688 0x1f4c2a 0x9743e 0xa50b7 0xa50e5 0x2604 0x14b3e99 0x1814e 0x180e6 0xbeade 0xbefa7 0x212c16 0x93b85d 0x1486936 0x14863d7 0x13e9790 0x13e8d84 0x13e8c9b 0x139b7d8 0x139b88a 0x15626 0x1ebd 0x1e25)

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


person bpapa    schedule 02.08.2012    source источник
comment