同一个视图中的两个 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
将使用相同的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;
【讨论】:
只要确保你提供了一个默认值,要么在末尾有一个默认的返回类型,要么让你的最后一个 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 个采用您可以为每个表格设置标签。然后在 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的主要内容,如果未能解决你的问题,请参考以下文章