两个UITableView在同一视图中

时间:2011-04-21 17:53:20

标签: objective-c ios cocoa-touch uitableview

我想知道是否允许在同一个视图中使用多个UItableView(我在Apple's Human Interface Guidelines中看不到任何内容),如果没有问题,如何加载不同的{{1在DataSource中为每个viewDidLoad

6 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分: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;
    } 
}

答案 2 :(得分:5)

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

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

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

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

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

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

  1. 为每个tableview编写一个控制器类,使其符合UITableViewDatasource协议
    • 实施您需要的协议方法。至少
      • – numberOfSectionsInTableView:
      • – tableView:numberOfRowsInSection:
      • – tableView:cellForRowAtIndexPath:
  2. 为每个tableview调用-setDataSource:到右控制器类的对象
  3. 我写了一个示例代码: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;
    }
    

答案 3 :(得分:3)

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

myTable.tag=12;

答案 4 :(得分:1)

为了让生活更轻松,您可以将两个不同的委托传递给UITableView。如果传入相同的委托,则必须执行大量的if语句。通过创建两个不同的委托,它将使您的代码更加清晰。

答案 5 :(得分:1)

您可以在一个视图中拥有多个表视图。向每个表视图添加标签,并使用tableview.tag,您可以单独将数据加载到tableviews中。

示例:

 - (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;

    }