У меня есть UIViewController, который позволяет мне просматривать и редактировать информацию о классе.
Он выделяется только один раз, но количество строк, разделов и данных передается ему в зависимости от значения, выбранного пользователем.
Например. Здесь редактируется свойство name & type (слишком большой заголовок таблицы. Я сделал это, чтобы вы увидели странность внизу)
Итак, я ввожу имя, и все отображается нормально. Затем я нажимаю на свойство адреса, и подробный вид теперь выглядит следующим образом:
Пока все в порядке. Если я нажму кнопку «Отмена» и вернусь к редактированию свойства name, оно отобразится нормально.
Проблема в этом. Я прокручиваю таблицу адресов так:
А затем нажмите Сохранить / отменить. Теперь, когда я возвращаюсь к редактированию свойства name, табличное представление выглядит так!
Как будто предыдущая таблица все еще видна через заголовок таблицы ..?
Мой viewWillAppear: метод для этого контроллера uiview выглядит следующим образом:
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"Retain count of poolcopy is %d\n\n", [self.thePoolFacilityCopy retainCount] );
//This will be a reference to find our which pool Instance field we are editing.
self.sectionFromParentTable = self.cellPath.section;
//This will only be used by the arrays
self.rowFromPreviousTable = self.cellPath.row;
NSString *sectionName;
switch (self.sectionFromParentTable) {
case KNameIndex:
sectionName = @"name";
break;
case KAddressIndex:
sectionName = @"address";
break;
case KPhoneNumberIndex:
sectionName = @"phone";
break;
case KWebAddressIndex:
sectionName = @"url";
break;
case KPricesIndex:
sectionName = @"prices";
break;
case KPoolIndex:
sectionName = @"pools";
default:
break;
}
self.title = [NSString stringWithFormat:@"Editing %@", sectionName];
// use an empty view to position the cells in the vertical center of the portion of the view not covered by
// the keyboard
if (self.sectionFromParentTable == KPhoneNumberIndex || self.sectionFromParentTable == KWebAddressIndex) {
UIView *singleSectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 60)];
self.theTableView.tableHeaderView = singleSectionHeaderView;
[singleSectionHeaderView release];
self.theTableView.tableFooterView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 10)]autorelease];
}
else if (self.sectionFromParentTable == KAddressIndex) {
UIView *addressHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 0)];
self.theTableView.tableHeaderView = addressHeaderView;
[addressHeaderView release];
self.theTableView.tableFooterView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 250)]autorelease];
}
else if (self.sectionFromParentTable == KPoolIndex) {
UIView *poolHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 2)];
self.theTableView.tableHeaderView = poolHeaderView;
[poolHeaderView release];
self.theTableView.tableFooterView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 10)]autorelease];
}
else {
UIView *doubleSectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 30)];
self.theTableView.tableHeaderView = doubleSectionHeaderView;
[doubleSectionHeaderView release];
self.theTableView.tableFooterView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 10)]autorelease];
}
[self.theTableView reloadData];
}
На рисунке, где таблица выглядит испорченной, метод cellForRowAtIndexPath вызывается только дважды, даже если видны 3 ячейки (2 нормальные и одна странная). Странная ячейка движется с прокруткой и по-прежнему кликабельна.
Я могу решить эту проблему, закомментировав следующие строки в этом методе. Однако я не хочу выделять новый контроллер каждый раз, когда кто-то хочет редактировать деталь:
- (PoolFacilityDetailEditController *)childController {
// Instantiate the editing view controller if necessary.
// if (childController == nil) {
PoolFacilityDetailEditController *controller = [[PoolFacilityDetailEditController alloc] initWithNibName:@"PoolFacilityDetailEditController" bundle:nil];
self.childController = controller;
[controller release];
// }
return childController;
}