Ios 从tableViewController分离UITableView委托和数据源

Ios 从tableViewController分离UITableView委托和数据源,ios,objective-c,uitableview,delegates,datasource,Ios,Objective C,Uitableview,Delegates,Datasource,由于委托和数据源方法,以及我有多个子类UITableViewCells和不同的单元格布局,我的tableView控制器变得越来越庞大。我在看,但实际上只是讨论了如何实现dataSource/delegate类中的方法,而不是如何将其连接到视图控制器 因此,我创建了一个符合tableView委托和数据源协议的类,添加了一个tableView属性作为tableView的引用,以及一个posts属性作为数据源数组 @interface SPPostsDataSouceAndDelegate : NSO

由于委托和数据源方法,以及我有多个子类UITableViewCells和不同的单元格布局,我的tableView控制器变得越来越庞大。我在看,但实际上只是讨论了如何实现dataSource/delegate类中的方法,而不是如何将其连接到视图控制器

因此,我创建了一个符合tableView委托和数据源协议的类,添加了一个tableView属性作为tableView的引用,以及一个posts属性作为数据源数组

@interface SPPostsDataSouceAndDelegate : NSObject <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic) NSArray *posts;

@end
在视图中,确实加载了将数据源和委托设置为该属性,并将该属性设置为tableView,并将属性发布到我的视图控制器的属性

self.postsDataSourceAndDelegate = [[SPPostsDataSouceAndDelegate alloc] init];
self.tableView.delegate = self.postsDataSourceAndDelegate;
self.tableView.dataSource = self.postsDataSourceAndDelegate;
self.postsDataSourceAndDelegate.posts = self.posts; 
但是,它不起作用。我丢了什么东西吗?就像我说的,我试着跟随我链接的答案,但它并没有真正解释这一部分,而且我发现的所有其他东西都没有真正说明一旦你真的创建了单独的类该做什么,所以我在这里有点迷茫


编辑:我重构了代码,使委托/数据源不再具有对tableView的引用。所以这很好。还是什么都没做,尽管我想出来了。从后端检索数据源后,需要更新其posts属性。使用前面提到的动态选择器方法,能够重构我的许多自定义单元格代码,从而消除表中所有不同单元格的所有if块。现在一切都很好

 [allPostsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

        if (!error) {


            self.postsDataSourceAndDelegate.posts = objects;
            [self.tableView reloadData];

您是否曾经创建一个对象并将其分配给
postsDataSourceAndDelegate
?当您将其设置为表视图委托时,
self.postsDataSourceAndDelegate
的内容是什么?表视图知道数据源/委托,而数据源/委托知道表视图也是一个坏主意。1) 如前所述,这为您提供了一个参考周期。2) 这是个糟糕的设计。您的
SPPostsDataSouceAndDelegate
类中不需要
tableView
属性。是的,我在视图中首先分配并初始化了它,很抱歉,意外地忽略了这一点。是的,我认为它们都互相引用是不好的,但是如何从委托/数据源方法中引用tableView,而不将引用属性返回tableView?某些确定单元格高度的方法需要将单元格从tableView中出列,这就是为什么我有属性将单元格出列以计算单元格高度也是不合适的。用这些数据来计算高度。嗯,我就是这样做的,这样做比用数据本身简单得多。有什么不好的原因吗?
 [allPostsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

        if (!error) {


            self.postsDataSourceAndDelegate.posts = objects;
            [self.tableView reloadData];