UITableViewController中的多个自定义原型单元格

时间:2014-07-10 04:09:58

标签: ios uitableview cell

我一直在互联网上搜索大约两天,但我似乎无法理解这是如何工作的。

我有两个视频单元FeaturedVideoCell和YouTubeVideoCell。只有一个FeaturedVideoCell和多个YouTubeVideoCells ......

我正在运行数据获取算法并将获取填充两个单元格的数据,然后通过重新加载表格数据来填充单元格。每个单元格根据相应数组中的对象计数填充一定数量的行。

我让它为YouTubeVideoCells工作,但似乎无法让第二个功能完成。我得到一个错误或者它没有加载我的第一个单元格。我尝试过这个网站和其他网站的多个解决方案,我感到非常沮丧。有谁知道这个适当的实现技术?我也在使用故事板......

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(isFiltered)
{
    return filteredyoutuberArray.count;
}
else
{
    return youtuberArray.count;
}
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"videoCell";
YouTubeVideoCell *cell = nil;

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[YouTubeVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

YouTubeVideoObj* tempVideo = [[YouTubeVideoObj alloc] init];
if(isFiltered == TRUE)
{
    tempVideo = [filteredyoutuberArray objectAtIndex:indexPath.row];
}
else
{
    tempVideo = [youtuberArray objectAtIndex:indexPath.row];
}

cell.YouTuberName.text = tempVideo.YouTuberName;
cell.totalUploadViews.text = tempVideo.totalUploadViews;
cell.subscribers.text = tempVideo.subscribers;
cell.videoCount.text = tempVideo.videoCount;
cell.orderNum.text = tempVideo.orderNum;
cell.profile.image = tempVideo.profile;

[cell setNeedsLayout];
[cell setNeedsDisplay];
[cell prepareForReuse];

return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

4 个答案:

答案 0 :(得分:1)

阿。我想我知道发生了什么......你有两个不同的UITables吗? 如果是这样,无论选择/触摸/调用/填充哪个单元格/表格,都会触发相同的方法cellForRowAtIndexPath。

如果这是您的问题,请尝试检测WHICH表当前正在调用该方法,然后在每种情况下执行相应的操作。例如:

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

// blah blah cell stuff 

if(tableView == YouTubeTable) {
  // assign relevant data to relevant table based on relevant row
}
else if (tableView == FeaturedTable) {
  // ditto but with different relevance
}

}

???

答案 1 :(得分:0)

而不是采取2个单独的细胞, 分2节,

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
  return 2; // 2 sections
  }

1表示静态单元格,另一部分表示动态单元格元素。 它更加微妙

答案 2 :(得分:0)

您已经实现了它,就像您将isFilter的值设置为TRUE一样,该表将显示filteredyoutuberArray单元格,如果isFilter的值为FALSE,则表格将显示youtuberArray单元格。那么你想要展示什么,tableView中的两种类型的单元格?如果是的话,

NSMutableArray *array = [[NSMutableArray alloc] initWithArray: filteredyoutuberArray];
[array addObjectsFromArray: youtuberArray];

  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
         return filteredyoutuberArray.count+youtuberArray.count;
   }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"videoCell";
    YouTubeVideoCell *cell = nil;

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[YouTubeVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    YouTubeVideoObj* tempVideo = [[YouTubeVideoObj alloc] init];
    tempVideo = [array objectAtIndex:indexPath.row];

    cell.YouTuberName.text = tempVideo.YouTuberName;
    cell.totalUploadViews.text = tempVideo.totalUploadViews;
    cell.subscribers.text = tempVideo.subscribers;
    cell.videoCount.text = tempVideo.videoCount;
    cell.orderNum.text = tempVideo.orderNum;
    cell.profile.image = tempVideo.profile;
   [cell prepareForReuse];

   return cell;

}

如果您将采用两个部分,则必须检查该部分并相应地获取数组以获取对象。

答案 3 :(得分:0)

我实际上没有得到你的问题,但我想我应该告诉你下面的代码是非常糟糕的编码,尤其是[cell prepareForReuse];cellForRow:之前被tableView调用,这会导致bug 。在大多数情况下,[cell setNeedsLayout];不应该[cell setNeedsDisplay]; cellForRow:调用{/ 1}} [cell setNeedsLayout]; [cell setNeedsDisplay]; [cell prepareForReuse];

{{1}}