UITableView странность! с картинками - PullRequest
4 голосов
/ 17 февраля 2009

У меня есть UIViewController, который позволяет мне просматривать и редактировать информацию о классе.

Он выделяется только один раз, но количество строк, разделов и данных передается ему в зависимости от значения, выбранного пользователем.

Например. Здесь редактируется свойство name & type (слишком большой заголовок таблицы. Я сделал это, чтобы вы увидели странность внизу)

alt text

Итак, я ввожу имя, и все отображается нормально. Затем я нажимаю на свойство адреса, и подробный вид теперь выглядит следующим образом:

alt text

Пока все в порядке. Если я нажму кнопку «Отмена» и вернусь к редактированию свойства name, оно отобразится нормально. Проблема в этом. Я прокручиваю таблицу адресов так:

alt text

А затем нажмите Сохранить / отменить. Теперь, когда я возвращаюсь к редактированию свойства name, табличное представление выглядит так!

alt text

Как будто предыдущая таблица все еще видна через заголовок таблицы ..?

Мой 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;
}

Ответы [ 2 ]

2 голосов
/ 17 февраля 2009

Трудно сказать, не глядя на весь код, но возможно ли, что вы неправильно перерабатываете свои ячейки таблицы? Вы должны назначить разные reuseIdentifier для каждой ячейки, которая отображается по-разному. Если ячейка заголовка повторно используется в качестве ячейки сведений (или наоборот), это вызывает некоторые странности при рендеринге.

0 голосов
/ 09 марта 2012

Используйте другой класс от TableViewCell, полностью настройте его согласно вашим требованиям. Затем импортируйте это в свой код. Оно работает!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...