同一个视图中的两个 UITableView

Posted

技术标签:

【中文标题】同一个视图中的两个 UITableView【英文标题】:Two UITableView in the same view 【发布时间】:2011-04-21 17:53:20 【问题描述】:

我想知道是否允许在同一个视图中使用多个UItableView(我在Apple's Human Interface Guidelines 中看不到任何东西),如果可以,如何在viewDidLoad 中加载不同的DataSource对于每个UITableView

【问题讨论】:

在您找到示例代码的地方尝试此操作,其中包含 2 种不同方法的完整说明:请参阅我在 ***.com/a/11789681/846372 中的回答 【参考方案1】:

您当然可以拥有多个表视图。您需要确保为每个指针保留一个指针,然后在您的数据源方法中,您将执行以下操作:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

     if(tableView == tableViewOne)
           return 5;
     else //if (tableView == tableViewTwo)
           return 3;

这对于所有委托/数据源方法都是一样的,这就是为什么它们会为您提供哪个表视图作为参数。

【讨论】:

【参考方案2】:

是的,你可以。问题是每个UITableView 将使用相同的UITableViewDataSourceUITableViewDelegate。因此,您必须在每个必要的委托方法中确定您正在使用哪个表视图。

例如:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

    // make bigger rows

    if (tableView == myBigRowTableView)
    
        // make bigger rows
        return 127;
     else if (tableView == mySmallRowTableView) 
        // make smaller rows
        return 20;
     else 
        return 30;
     

【讨论】:

只要确保你提供了一个默认值,要么在末尾有一个默认的返回类型,要么让你的最后一个 if 子句只是 else,否则你会得到编译器警告。跨度> 【参考方案3】:

IMO 最简洁的解决方案是为每个 tableview 设置一个控制器。

如果你对 n tableview 使用一个控制器,你将不得不在很多地方使用 if-statemenst, 在

– numberOfSectionsInTableView: – tableView:numberOfRowsInSection: – tableView:titleForHeaderInSection:

基本上在您需要实现的所有 UITableViewDatasource-Protocol 方法中。

因此,如果您需要更改某些内容,则必须在很多地方进行更改。

如果你为一个 tableview 使用一个控制器类,你根本不需要检查。

    为每个tableview编写一个控制器类,使其符合UITableViewDatasource协议 实现您需要的协议方法。至少 – numberOfSectionsInTableView:, – tableView:numberOfRowsInSection:, – tableView:cellForRowAtIndexPath: 为每个表视图调用-setDataSource:到正确控制器类的对象

我写了一个示例代码:https://github.com/vikingosegundo/my-programming-examples/tree/master/TwoTableViews

TwoTableViewsViewController.m

- (void)viewDidLoad 
    [super viewDidLoad];
    if (firstController == nil) 
        firstController = [[FirstTVContoller alloc] init];
    
    if (secondController == nil) 
        secondController = [[SecondTVController alloc] init];
    
    [firstTable setDataSource:firstController];
    [secondTable setDataSource:secondController];

    [firstTable setDelegate:firstController];
    [secondTable setDelegate:secondController];
    firstController.view = firstController.tableView;
    secondController.view = secondController.tableView;

【讨论】:

这种方法的忠实粉丝。更干净,更有条理。 无需调用额外的视图控制器和加载新视图。您可以创建 2 个采用 和您的表可能需要的其他协议的类。在主视图控制器上创建这些委托作为属性。然后,无论是在代码中还是在 XIB 文件中,您都可以将它们作为各自的委托和数据源分配给您的两个表。它与上面概述的方法类似,但无需将更多控制器和视图的复杂性添加到您的层次结构中。【参考方案4】:

您可以为每个表格设置标签。然后在 tableview 委托方法中应用该条件,例如:

myTable.tag=12;

【讨论】:

【参考方案5】:

为了让生活更轻松,您可以将两个不同的委托传递给 UITableView。如果你传入同一个委托,你将不得不做很多 if 语句。通过创建两个不同的委托,它可以让你的代码更加简洁。

【讨论】:

但这通常不是最佳实践,因为您必须有多个类才能做到这一点。代码应该放在最有意义的地方,而不是可以节省程序员打字的地方。 @Christian,将代码放在另一个类中不会节省输入。分隔代码称为封装【参考方案6】:

您可以在一个视图中拥有多个表视图。为每个表视图添加标签,使用 tableview.tag 可以将数据分别加载到表视图中。

例子:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
     if (tableView.tag == x) 
        //code to load table view with tag value x

        
        else
        //code to load second table
        
        return cell;

    

【讨论】:

以上是关于同一个视图中的两个 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

一个视图控制器中的两个表视图,快速

一个视图中的两个 UIPoovers

一个视图控制器中的两个警报视图 - buttonIndex 响应

如何将 xib 加载到一个视图控制器中的两个容器视图中

一个视图控制器中的两个表视图 swift

同一视图中的两个 uipicker