Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 同一视图中的两个UITableView_Objective C_Ios_Cocoa Touch_Uitableview - Fatal编程技术网

Objective c 同一视图中的两个UITableView

Objective c 同一视图中的两个UITableView,objective-c,ios,cocoa-touch,uitableview,Objective C,Ios,Cocoa Touch,Uitableview,我想知道是否允许在同一个视图中使用多个UItableView(我在中没有看到任何东西),如果可以,如何在viewdiload中为每个UItableView加载不同的数据源?可以。问题是每个UITableView都将使用相同的UITableViewDataSource和UITableViewDelegate。因此,必须确定在每个必要的委托方法中使用的表视图 例如: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPa

我想知道是否允许在同一个视图中使用多个
UItableView
(我在中没有看到任何东西),如果可以,如何在
viewdiload
中为每个
UItableView
加载不同的
数据源?

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

例如:

- (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;
    } 
}
myTable.tag=12;

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

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

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

为了简化操作,您可以将两个不同的委托传递给UITableView。如果传入同一个委托,则必须执行许多If语句。通过创建两个不同的委托,您的代码将更加干净。

IMO最干净的解决方案是为每个tableview使用一个控制器

如果在n tableview中使用一个控制器,则必须在许多地方使用If statemenst, 在

  • –numberOfSectionsInTableView:
  • –表视图:行数部分:
  • –表格视图:标题标题部分:
基本上,在所有需要实现的UITableViewDatasource协议方法中

因此,如果你需要改变某些东西,你必须在很多地方改变它

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

  • 为每个tableview编写一个控制器类,使其符合
    UITableViewDatasource
    协议
    • 实现您需要的协议方法。至少
      • –numberOfSectionsInTableView:
      • –表视图:行数部分:
      • –tableView:cellForRowAtIndexPath:
  • 为每个tableview调用
    -setDataSource:
    ,以获得正确控制器类的对象
  • 我编写了一个示例代码:

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

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

    - (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;
        } 
    }
    
    myTable.tag=12;
    

    在一个视图中可以有多个表视图。向每个表视图添加标记,使用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;
    
        }
    

    只需确保您提供的是默认值,要么在末尾使用默认返回类型,要么将最后一个if子句设置为Just else,否则您将收到编译器警告。但这通常不是最佳做法,因为您必须使用多个类才能做到这一点。代码应该放在最有意义的地方,而不是可以保存程序员键入的地方。@Christian,将代码放在另一个类中不会保存键入。分离代码称为封装。这种方法的忠实粉丝。更干净、更有条理。无需调用其他视图控制器和加载新视图。您可以创建2个类,这些类采用和表可能需要的其他协议。在主视图控制器上创建这些代理作为属性。然后,无论是在代码中还是在XIB文件中,都可以将它们作为各自的委托和数据源分配给两个表。它与上面概述的方法类似,但不需要向层次结构中添加更多控制器和视图的复杂性。请尝试使用此方法,您可以找到示例代码,其中完整解释了两种不同的方法:请参阅中的“我的答案”