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文件中,都可以将它们作为各自的委托和数据源分配给两个表。它与上面概述的方法类似,但不需要向层次结构中添加更多控制器和视图的复杂性。请尝试使用此方法,您可以找到示例代码,其中完整解释了两种不同的方法:请参阅中的“我的答案”