将 UITableView 委托和数据源从 tableViewController 中分离出来
Posted
技术标签:
【中文标题】将 UITableView 委托和数据源从 tableViewController 中分离出来【英文标题】:separating UITableView delegate and datasource from tableViewController 【发布时间】:2014-11-01 00:20:03 【问题描述】:由于委托和数据源方法以及我有多个 UITableViewCells 子类和每个子类的不同单元格布局这一事实,我的 tableView 控制器变得越来越大。我在看this post,但它实际上只是讨论了如何实现 dataSource/delegate 类中的方法,而不是如何将它连接到您的视图控制器。
所以我创建了一个符合 tableView 委托和数据源协议的类,添加了一个 tableView 属性用作对 tableView 的引用,以及一个 posts 属性用作数据源数组。
@interface SPPostsDataSouceAndDelegate : NSObject <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic) NSArray *posts;
@end
我将我的委托和数据源方法从我的 tableView 控制器中剪切到该类的实现中。然后在我的 tableView 控制器中,我为该数据源和委托类添加了一个属性。
@property (nonatomic) SPPostsDataSouceAndDelegate *postsDataSourceAndDelegate;
并且在视图中确实将数据源和委托设置为该属性,并将该属性 tableView 和帖子属性设置为我的视图控制器的属性。
self.postsDataSourceAndDelegate = [[SPPostsDataSouceAndDelegate alloc] init];
self.tableView.delegate = self.postsDataSourceAndDelegate;
self.tableView.dataSource = self.postsDataSourceAndDelegate;
self.postsDataSourceAndDelegate.posts = self.posts;
但是它不起作用。我有什么遗漏吗?就像我说的那样,我试图按照我链接的答案进行操作,但它并没有真正解释这部分,而且我发现的其他所有内容都没有真正说明一旦你真正创建了单独的类后该怎么做,所以我有点迷失在这里。
编辑:我重构了我的代码,以便委托/数据源不再有对 tableView 的引用。所以那很好。还是什么都没做
【问题讨论】:
您是否曾经创建过一个对象并将其分配给postsDataSourceAndDelegate
?将self.postsDataSourceAndDelegate
设为table view delegate时的内容是什么?
表视图知道数据源/委托而数据源/委托知道表视图也是一个坏主意。 1)正如所写,这为您提供了一个参考周期。 2)这是糟糕的设计。 SPPostsDataSouceAndDelegate
类中不需要 tableView
属性。
是的,我首先分配并初始化它,因为确实加载了,抱歉,不小心把它遗漏了。是的,我认为它们相互引用并不好,但是如何在委托/数据源方法中引用 tableView 而无需将引用属性返回给 tableView?一些确定单元格高度的方法需要从 tableView 中取出一个单元格,这就是我在那里拥有该属性的原因
出列一个单元格来计算单元格的高度也是不合适的。使用数据计算高度。
嗯,好吧,我刚刚关注了这个tutorial on using auto layout with dynamic tableView cells,这就是它在那里完成的方式,这样做比使用数据本身要容易得多。有什么不好的原因吗?
【参考方案1】:
想通了。从后端检索数据源后需要更新数据源的帖子属性。还能够使用here 提到的动态选择器方法重构我的许多自定义单元格代码,以摆脱表中所有不同单元格的所有 if 块。现在一切都很好
[allPostsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
if (!error)
self.postsDataSourceAndDelegate.posts = objects;
[self.tableView reloadData];
【讨论】:
以上是关于将 UITableView 委托和数据源从 tableViewController 中分离出来的主要内容,如果未能解决你的问题,请参考以下文章
从 prepareForSegue:sender 设置 UITableView 委托和数据源时出错:
在自定义 UIview 中设置 UItableview 的委托和数据源
在单独的文件中设置 UITableView 数据源和委托 - swift