UITableView中有2种不同类型的自定义UITableViewCell

Sor*_*ohi 53 iphone uitableview

在我的UITableView中我想设置rss feed的第一个新闻自定义tableViewCell(类型A让我们说)和其他新闻第二,第三等等.另一个自定义tableViewCell(trype B)的问题是自定义tableViewCell( trype A)为第一个新闻创建的是重用的,但奇怪的是首次使用customViewCell(类型A)和相同类型的customViewCell的第二个外观之间的行数不相等.

我的cellForRowAtIndexPath看起来像这样.

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

    int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1];
    Feed *item = [[[[self selectedButton] category] feedsList] objectAtIndex:feedIndex + 1];
    static NSString *CellIdentifier = @"Cell";

    if(feedIndex == 0){
        MainArticleTableViewCell *cell = (MainArticleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil)
        {
            cell = [[[MainArticleTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
            [[[cell subviews] objectAtIndex:0] setTag:111];
        }

        cell.feed = item;

        return cell;

    }
    else{
        NewsTableViewCell *cell = (NewsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil)
        {
            cell = [[[NewsTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier orientation:currentOrientation] autorelease];
            [[[cell subviews] objectAtIndex:0] setTag:111];
        }

        cell.feed = item;

        return cell;

    }
    return nil;
}    
Run Code Online (Sandbox Code Playgroud)

两种类型的细胞具有不同的高度,这是正确设置的.有人能指出我正确的方向,如何使类型A自定义单元格只出现在第一个新闻(不被重用)?谢谢

Phi*_*ert 78

您应该为两种样式的单元格创建不同的单元格标识符:

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

int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1];
Feed *item = [[[[self selectedButton] category] feedsList] objectAtIndex:feedIndex + 1];

static NSString *CellIdentifier1 = @"Cell1";
static NSString *CellIdentifier2 = @"Cell2";

if(feedIndex == 0) {

   MainArticleTableViewCell *cell = (MainArticleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

   if (cell == nil) {
       cell = [[[MainArticleTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier1] autorelease];
       [[[cell subviews] objectAtIndex:0] setTag:111];
   }

   cell.feed = item;

   return cell;
}
else {
   NewsTableViewCell *cell = (NewsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

   if (cell == nil) {
       cell = [[[NewsTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier2 orientation:currentOrientation] autorelease];
       [[[cell subviews] objectAtIndex:0] setTag:111];
   }

   cell.feed = item;

   return cell;
}

return nil;
}
Run Code Online (Sandbox Code Playgroud)

  • 非常好的答案.读完之后我唯一要知道的是:为单元格注册2个笔尖是完全可以的.`[self.tableView registerNib:[UINib nibWithNibName:@"Cell1"bundle:nil] forCellReuseIdentifier:cellId1]; [self.tableView registerNib:[UINib nibWithNibName:@"Cell2"bundle:nil] forCellReuseIdentifier:cellId2];`该解决方案适用于Xcode 6和iOS 8 :) (2认同)

Chr*_*her 8

我不完全理解你的问题,但注意到两件奇怪的事情.如果您使用两种不同的单元格类型,则在调用"dequeueReusableCellWithIdentifier"时需要使用两个不同的单元格标识符.您当前正在为两者使用相同的标识符,这是不正确的.尝试类似的东西:

static NSString *MainArticleIdentifier = @"MainArticle";
static NSString *NewsIdentifier = @"News";
Run Code Online (Sandbox Code Playgroud)

此外,我从来没有见过像:

int feedIndex = [indexPath indexAtPosition:[indexPath length] - 1];
Run Code Online (Sandbox Code Playgroud)

为什么不使用:

int feedIndex = indexPath.row;
Run Code Online (Sandbox Code Playgroud)