如何在 Storyboard 中的自定义 UITableViewCell 中配置 UITableView?

Posted

技术标签:

【中文标题】如何在 Storyboard 中的自定义 UITableViewCell 中配置 UITableView?【英文标题】:How to configure UITableView inside custom UITableViewCell in a Storyboard? 【发布时间】:2015-08-04 11:33:58 【问题描述】:

我有一个 layout,其中我将有 2 个 UITableViews 和自定义 cells。第二个UITableView 必须在第一个里面。

我的问题是:如何委托第二个UITableView

我可以将两者都委托给我的ViewController 吗?在这种情况下,它将使用相同的方法,我必须找出现在管理哪个UITableView

或者我必须在第一个 UITableView 的自定义 UITableViewCell 中委托它?

感谢任何建议。

编辑:我不知道如何在这里实施解决方案,因为我有Storyboard。在我当前的UIViewController 中,我将第一个UITableViewdelegatedataSource 设置为我的视图控制器。

我的问题是我不知道如何设置第二个表视图的相同属性(将在UITableViewCell 内)。我不能将它们设置为UITableViewCell(IB 不允许这样做)。

然后在 IB 中的哪里以及如何设置?

【问题讨论】:

【参考方案1】:

更好的解决方案是将 DataSource 和 Delegate 实现从您的视图控制器中抽象出来,以便可以根据需要对每个 tableview 进行个性化(请注意,代码取自 objc.io 文章Lighter View Controllers。

例如

@implementation ArrayDataSource

- (id)itemAtIndexPath:(NSIndexPath*)indexPath 
    return items[(NSUInteger)indexPath.row];


- (NSInteger)tableView:(UITableView*)tableView 
 numberOfRowsInSection:(NSInteger)section 
    return items.count;


- (UITableViewCell*)tableView:(UITableView*)tableView 
        cellForRowAtIndexPath:(NSIndexPath*)indexPath 
    id cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier
                                              forIndexPath:indexPath];
    id item = [self itemAtIndexPath:indexPath];
    configureCellBlock(cell,item);
    return cell;


@end

那么你可以如下使用它:

void (^configureCell)(PhotoCell*, Photo*) = ^(PhotoCell* cell, Photo* photo) 
   cell.label.text = photo.name;
;
photosArrayDataSource = [[ArrayDataSource alloc] initWithItems:photos
                                                cellIdentifier:PhotoCellIdentifier
                                            configureCellBlock:configureCell];
self.tableView.dataSource = photosArrayDataSource;

UITableViewDelegate 实现可以遵循相同的过程,为您提供一个非常干净、分离和解耦的代码库。然后,您对两个 tableview 的要求将更容易实现。

【讨论】:

我同意你的观点,但我会批准其他答案,因为我实施了它。【参考方案2】:

我的答案是

  For identifying two table view data source and delegate method is,better to set tag for the table views.

在您的 tableview 委托方法中设置以下编码。

 if(tableView.tag==0)
 
 
 else
 
 

您也可以通过为这些表格视图分配不同的名称来改变这一点。

 if(tableView==FirstTableView)
 
 
 else
 
 

【讨论】:

【参考方案3】:

您只需检查每个委托方法的表条件

使用此代码注册自定义单元格。

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

if(tableView == self.yourFirstTable)

    CustomCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cellModifier"];
    // your code

else

    // second table cell code

return cell;




 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    
        if(tableView == self.yourFirstTable)
        
             // first tableView number of row return
        
        else
        
             // second table number of row return
           
   

并在TableView中创建原型单元

并像这样设置 CellReusableId

【讨论】:

对不起,我已经知道了。我的问题是如何配置第二个UITableViewdatasourcedelegate - 必须为它们配置哪个对象。 啊,好的。我认为这可能是解决方案,但我不确定它是否会起作用。 10 倍。我会尝试,如果可以,我会接受答案。 对不起@Dharmesh Dhorajiya,但我错过了一些东西 - 在 ViewController 或第一个 UITableView 上为第二个 UITableView 设置委托的位置。还有在哪里设置第二个UITableView的出口? 我理解答案并实现了它,但第二张桌子没有旋转正确 - 我有 2 次第 0 部分而不是第 0 部分和第 1 部分 - 我哪里会出错? UITableView 都被委托并在 Storyboard 中设置数据源。 试试这个方法if(tableView == self.yourFirstTable) // first tableView number of row return if(indexPath.section==0) //1 section code else if (indexPath.section==1) // 2 section code else // second table number of row return if(indexPath.section==0) //1 section code else if (indexPath.section==1) // 2 section code @new2ios

以上是关于如何在 Storyboard 中的自定义 UITableViewCell 中配置 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

无法更改 Storyboard 中的自定义 UICollectionViewCell

StoryBoard 中的自定义 UITableViewCell AutoLayout 右对齐

如何在 Storyboard 控制器中重用定义为原型单元的自定义 UITableViewCell

更改 uitableviewcell 中的自定义附件视图?

不使用 Storyboard segues 的自定义视图转换 (Swift)

UITableVIewCell 重叠图像中的自定义按钮