Цель C UITableView - ячейки таблицы отображают неправильный контент после изменения высоты ячейки - PullRequest
4 голосов
/ 22 февраля 2011

Я пытаюсь создать приложение в xcode, которое, помимо других, читает RSS-канал и отображает сообщения. Я новичок в объективе-c, и иногда мне сложно.

Я использую NSMutableArray для найденных историй (постов). Каждая история представлена ​​NSMutableDictionary, который содержит заголовок, тему, дату и ссылку на пост. Все это отображается в UITableView в UIViewController. Я настроил свою собственную ячейку, поэтому я могу отображать в ней несколько ярлыков.

Моя проблема заключается в том, что если я использую tableView: heightForRowAtIndexPath:, первые 5 ячеек (которые соответствуют экрану) отображаются нормально, но если вы прокрутите вниз, у следующих ячеек будет одинаковое содержимое с первыми 5 (то есть ячеек 0- 4 отображается нормально, ячейка 5 содержит содержимое ячейки 0, ячейка 6 ячейки 1 и т. Д.)! Если я удаляю tableView: heightForRowAtIndexPath: все в порядке (кроме отсутствия нужного размера ячейки)

Вот как выглядит код:

//  NavigationContentsViewController.h
@interface NavigationContentsViewController :
UIViewController <UITableViewDelegate, UITableViewDataSource> {

    UITableView *myTableView;
    IBOutlet UITableView * newsTable;
    UIActivityIndicatorView * activityIndicator;
    CGSize cellSize;
    NSXMLParser * rssParser;
    NSMutableArray * stories; 
    NSMutableDictionary * item; // it parses through the document, from top to bottom...

    NSString * currentElement;
    NSMutableString * currentTitle, * currentDate, * currentSummary, * currentLink;

}

@property(nonatomic,retain)NSMutableArray *itemsList;
@property(nonatomic,retain)UITableView *myTableView;
- (void)parseXMLFileAtURL: (NSString *)URL;

.

//NavigationContentsViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

// Configure the cell.
static NSString *MyIdentifier = @"MyIdentifier";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil){
    cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    // Set up the cell 
    int storyIndex = indexPath.row;
    //[cell setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]];
    //Story title
    //cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    //cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    cell.lTitle.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    cell.lSummary.text = [[stories objectAtIndex: storyIndex] objectForKey: @"summary"];
    cell.lDate.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];

    return cell;
}

return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *selectedCellItem = [NSString stringWithFormat:@"%d", indexPath.row];

    TableViewController *fvController = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:[NSBundle mainBundle]];
    fvController.selectedCellItem = selectedCellItem;
    [self.navigationController pushViewController:fvController animated:YES];
    [fvController release];
    fvController = nil; 
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 80;
}

Есть какие-нибудь подсказки? [РЕДАКТИРОВАТЬ: изменено int storyIndex = indexPath.row;]

Ответы [ 2 ]

11 голосов
/ 22 февраля 2011

Это обычная проблема, с которой сталкиваются люди при повторном использовании ячеек таблицы.

эта строка пытается повторно использовать ячейку. это означает, что если ячейка 0 переместится за пределы экрана, она будет использоваться как ячейка 5:

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

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

if (cell == nil){
    cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

и на следующей строке ваша проблема, вы настраиваете ячейку, только если ячейка не может быть повторно использована. Что происходит 5 раз (для ячеек, которые видны, когда таблица становится видимой).

Но все ячейки, которые ваша таблица хочет отобразить впоследствии, будут повторно использоваться ячейками, которые уже имеют содержимое.

    // Set up the cell 
    /*...*/

но не волнуйся. это очень легко исправить. Вы должны отделить создание своей ячейки от ее конфигурации. Просто сдвиньте немного кода следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil){
        cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }
    // whatever happened before. You have a valid cell at this point.

    // Set up the cell 
    int storyIndex = indexPath.row;
    //[cell setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]];
    //Story title
    //cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    //cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    cell.lTitle.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    cell.lSummary.text = [[stories objectAtIndex: storyIndex] objectForKey: @"summary"];
    cell.lDate.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];
    return cell;
}

РЕДАКТИРОВАТЬ: возможно я должен прочитать вопрос в следующий раз. Но, думаю, я все еще на 100% прав.

Если я удаляю tableView: heightForRowAtIndexPath: все в порядке (кроме отсутствия нужного мне размера ячейки)

Я думаю, что это совпадение. Сколько у вас клеток? Я думаю, около 7 или 8? Все хорошо, потому что все ваши клетки видны одновременно. Поэтому нет необходимости повторно использовать ячейку, и все они имеют контент, который должен иметь.

1 голос
/ 22 февраля 2011

Использование [indexPath indexAtPosition…], скорее всего, ваш источник ошибки - он не получает ваш правильный путь индекса.

Однако, если вы создаете CustomCell (надеюсь, в IB?), Вам следует установить размер ячейки в IB, а не делать это в коде.

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