两个UITableView在同一视图中

vin*_*nce 16 cocoa-touch objective-c uitableview ios

我想知道,如果它允许使用多种UItableView同一视图(我没有看到任何东西苹果的人机界面指南),如果它的确定,如何加载不同DataSourceviewDidLoad每一个UITableView

Chr*_*ian 20

你当然可以有多个表视图.您可能希望确保每个指针都有一个指针,然后在数据源方法中,您可以执行以下操作:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
     if(tableView == tableViewOne)
           return 5;
     else //if (tableView == tableViewTwo)
           return 3;
}
Run Code Online (Sandbox Code Playgroud)

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


dre*_*ful 5

是的你可以.问题是每个人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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 只需确保提供默认值,或者通过在末尾使用默认返回类型,或者让最后一个if子句为else,否则您将收到编译器警告. (2认同)

Vik*_*ica 5

IMO最干净的解决方案是为每个tableview配备一个控制器.

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

  • – numberOfSectionsInTableView:
  • – tableView:numberOfRowsInSection:
  • – tableView:titleForHeaderInSection:
  • ...

基本上,您需要实现的所有UITableViewDatasource-Protocol方法.

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

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

  1. 为每个tableview编写一个控制器类,使其符合UITableViewDatasource协议
    • 实现您需要的协议方法.至少
      • – numberOfSectionsInTableView:,
      • – tableView:numberOfRowsInSection:,
      • – tableView:cellForRowAtIndexPath:
  2. -setDataSource:每个tableview 调用到右侧控制器类的对象

我写了一个示例代码: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;
}
Run Code Online (Sandbox Code Playgroud)

  • 无需调用其他视图控制器并加载新视图.您可以创建两个采用<UITableViewDataSource,UITableViewDelegate,...>以及表可能需要的其他协议的类.在主视图控制器上将这些委托创建为属性.然后,无论是在代码中还是在XIB文件中,您都可以将它们作为相应的委托和数据源分配给您的两个表.它类似于上面概述的方法,但不需要为层次结构添加更多控制器和视图的复杂性. (9认同)