Мой UITable - это повторное использование ячеек, когда это не так! - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть UITableViewController, который состоит из двух разделов.В первом разделе показана отдельная ячейка с центрированным текстом со словами Add a new Slide.Второй раздел показывает текущие слайды.

Когда пользователь нажимает на ячейку Add a new slide, в стек помещается новый UITableVeiwController, отображающий редактор.Если пользователь сохраняет новый слайд (нажав «Сохранить»), ячейка добавляется в источник данных и редактор извлекается из стека.

У меня две проблемы:

  1. Когда редактор открывается, если ячейка была удалена до того, как Add a new slide была нажата, вместо новой отображается старая ячейка.Нажав на UITableViewController (нажав автоматически сгенерированную кнопку «Назад»), это исправляется, но я бы не хотел, чтобы это произошло вообще.(Изначально всплывающее окно таблицы не обновлялось после появления редактора, поэтому я добавил [self.tableView reloadData]; к методу viewDidAppear.)

  2. После определенного количества слайдов последний слайдв списке становится ячейка Add a new slide.Я знаю, что данные вводятся правильно, потому что другая часть приложения, которая использует тот же источник данных, обновляется правильно.Таблица поддерживает редактирование во втором разделе, и когда вы меняете порядок ячеек, она за кадром ведет себя правильно, но неправильная ячейка все еще там.

Что может происходитьon?

Вот мой код:

Обратите внимание, что, когда я готовился опубликовать свой код, я заметил несоответствие скобок.Проверка на cell==nil , кажется, охватывает вторую часть кода, которая определяет содержимое ячеек.Это исправляет метку ячеек во втором разделе таблицы, но стиль по-прежнему неверен.С тех пор я исправил код, но оригинал размещен здесь.

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        if ([indexPath section] == 0 ) {
            cell = [[[MBTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }else if([indexPath section] == 1){
            cell = [[[MBTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

    }

    if ([indexPath section] == 0) {
        [cell.textLabel setTextAlignment:UITextAlignmentCenter];
        [cell.textLabel setText:@"Add a New Slide"];
    }else if([indexPath section] == 1){
        NSArray *storedViewsInfo = [[NSArray alloc] initWithArray:[kSettings arrayForKey:@"views"]];

        if ([[[storedViewsInfo objectAtIndex:[indexPath row]] valueForKey:@"type"] isEqualToString:@"announcement"]) {
            [cell.detailTextLabel setText:@"Custom Announcement"];
            [cell.textLabel setText:[[[storedViewsInfo objectAtIndex:[indexPath row]] valueForKey:@"info"] valueForKey:@"text"]];
        }

        [storedViewsInfo release];
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];

    }
    }
    return cell;

}

1 Ответ

3 голосов
/ 08 декабря 2010

Не видя код, первое, что приходит на ум, - проверить, дали ли вы свои пользовательские ячейки другим идентификаторам в методе - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;?

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

    static NSString *CellIdentifier1 = @"CellIdentifier1";
    static NSString *Cellidentifier2 = @"CellIdentifier2";

    if (indexPath.section == kAddSlideSection) {
        CustomCell *cellType1 = (CustomCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        ...
    } else {
        CustomCell *cellType2 = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
        ...
    }
}

Также, возможно, стоит подумать о реализации метода делегата, который вызывается, когда ваш пользователь заканчивает добавлять новый слайд - т.е. при успешном вызове [self.tableview reloadData] из этого метода вместо viewWillAppear.

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