2017-08-07 66 views
0

我想外包tableView的委托和数据源协议。 因此,我创建了一个新的TableViewController,为它制作了一个Cocoa Touch Class 并删除了故事板中现有的委托和数据源连接。最后,我以编程方式设置委托和数据源。 它迄今为止工作正常,但我有一个问题。 请先看看我的代码。外包TableView协议

class TableViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let protocols = TableViewProtocols() 

     tableView.delegate = protocols 
     tableView.dataSource = protocols 
    } 
} 

正如我所说的它工作正常,但我试图使它更容易,不工作

class TableViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = TableViewProtocols() 
     tableView.dataSource = TableViewProtocols() 
    } 
} 

在我创建的TableViewProtocols一个对象,并在protocols保存它的第一个例子。我将它分配给委托和数据源。这是行得通的。

在第二个示例中,我没有保存TableViewProtocols的实例。相反,我在一行中创建并分配了一步。 而这不起作用。我不知道为什么。因为对我来说它看起来是一样的。首先创建一个对象和创建并直接在一行中分配有什么不同?

任何建议都被占用。 谢谢。

+1

第二个不工作,因为它创建TableViewProtocols'的'两个独立的实例。作为一种猜测,代表和数据源彼此交互(相互依赖),使得它们必须处于同一个实例中。 – bobnoble

+0

好的,是的,我认为你是对的。这就说得通了。非常感谢你。 – user1895268

回答

0

表视图不维护对其委托或数据源对象的强引用。所以,当你直接设置它们并且调用超出范围时,这些对象将被删除,并且tableview不再具有委托或数据源。

即使使用表视图控制器,拥有不同的数据源和委托也是完全可以接受的。执行此操作的一种简单方法是让表视图控制器具有对要委派的对象的引用,并且它具有强引用,然后设置委托和视图中的数据源的加载:

class TableViewController:UITableViewController {0} {0}不是最好的名字,但它是你所拥有的。

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = protocols 
    tableView.dataSource = protocols 
} 

}