Если вы хотите навсегда удалить ячейку таблицы, просто вызовите deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]
с indexPath, соответствующим вашей строке. Вам также нужно уменьшить число возвращаемых строк на numberOfRowsInSection:
.
Однако я искал способ временно «удалить» ненужные статические ячейки табличного представления из статического табличного представления, потому что я хотел, чтобы определенная строка была там иногда, а иногда нет. Я также хотел иметь возможность обновлять это по требованию извне контроллера tableview.
Мой случай довольно прост, поскольку это первая строка, которая была либо показана, либо скрыта. Вы можете обобщать в соответствии со своими потребностями. Мой контроллер табличного представления является моим делегатом источника данных.
Сначала я создал открытый метод в контроллере табличного представления для обновления переменных состояния и запуска повторного отображения:
- (void)updateSettingsDisplay:(BOOL)hideSetting
{
if (hideSetting == self.hideSetting) {
return; // no need to do anything because it didn't change
}
self.hideSetting = hideSetting;
self.numRows = (hideSetting)? kNumRowsWithSetting : kNumRowsWithoutSetting;
// redisplay only if we're visible
if (!self.viewJustLoaded && (self.navController.visibleViewController == self)) {
[self.tableView reloadData];
}
self.viewJustLoaded = NO;
}
Контроллер таблицы 101 * * выглядит следующим образом:
- (void)viewDidLoad
{
[super viewDidLoad];
// check whether or not to display out-of-coverage tableview cell
self.hideSetting = YES; // initial value; could just as easily be NO
self.viewJustLoaded = YES;
[self updateSettingsDisplay];
}
Делегат источника данных таблицы просмотра:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return self.numRows;
}
и наконец
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// set row to the index of the stored tableView cell that corresponds to the
// cell you want (its location in the static tableview from your storyboard)
NSInteger row = indexPath.row;
if (self.hideSetting) {
// skip drawing setting's tableviewcell (since the setting we're hiding is
// first, we can just increment the row to get the one we want)
++row;
assert(row < kTotalRows); // bounds checking just to convince yourself (remove after testing)
}
// get a new index path since the row field is read-only
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:row inSection:indexPath.section];
// grab the cell from super that corresponds to the cell you want
UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:newIndexPath]; // static table
return cell;
}
Хитрость в том, что статические ячейки всегда доступны в [super tableView:tableView cellForRowAtIndexPath:newIndexPath]
- так что используйте это для постоянного хранения ваших статических ячеек таблицы. Затем отрегулируйте количество строк по мере необходимости и правильно сопоставьте строки (т. Е. Получите строку сохраненной ячейки, которая соответствует ячейке, которую вы хотите отобразить) в делегате табличного представления cellForRowAtIndexPath:
.
Метод updateSettingsDisplay
может быть вызван на вашем контроллере таблиц любым классом, который его сохраняет. Если контроллер таблицы не виден при вызове, он просто обновит состояние и подождет, пока в следующий раз он станет видимым, чтобы изменить отображение.