是否可以将现有的UITableView重新分配给不同的UITableViewController?

时间:2014-08-07 19:31:28

标签: ios objective-c cocoa-touch uitableview uikit

我的大多数应用程序都是以编程方式创建的,但我有一些使用Interface Builder创建并以编程方式加载的复杂视图。

在一个视图中,我有一个以编程方式创建的UITableViewController子类,并且其tableView属性被分配给XIB中的UITableView实例,引用为IBOutlet。这发生在XIB的UIViewController的viewDidLoad中,表视图显示正确。

有一次,我需要更改表格视图的全部内容。理想情况下,我想从第一个UITableViewController断开该视图,并将其连接到另一个将为其提供不同数据的视图。尝试将视图分配给新控制器的tableView属性会导致"视图一次只能与一个视图控制器关联!"在分配新控制器之前将前一个控制器的tableView分配给nil可以避免错误,但是表格视图会从屏幕上消失。

老实说,我知道表视图实例通常由UITableViewController管理。我无法在文档中找到有关setTableView的任何内容,在指定的tableView中自动设置delegate和dataSource的后向引用,所以我很惊讶我的外部创建的tableView首先起作用。实际上,TVC文档似乎只是将UITableViewController的tableView属性作为readonly进行讨论,即使它没有被标记为。

2 个答案:

答案 0 :(得分:1)

我确定我没有掌握所有信息,但从表面上看,你似乎正在变得比它需要的更复杂。为什么不使用当前的UITableViewController和相应的UITableView并使用"新数据"重新加载它。或者,只需以编程方式创建另一个UITableViewController并将其用于新数据。是否有令人信服的理由回收UITableView?

答案 1 :(得分:1)

答案是,这就是原因:

我检查了调试器,普通的setTableView确实在self上设置了view属性,并在新的传入tableView上设置了delegate和dataSource属性。 Apple没有记录这一点,但它是假定的行为,所以它一切都很好。

我没有意识到默认的setView(来自UIViewController)将在设置新视图之前从其超级视图中删除现有视图。一次防止"一个视图控制器"运行时错误我将旧的TVC的tableView设置为nil,这导致我打算重用的tableView从视图层次结构中删除。为了避免这种行为,我们必须覆盖setView,这比我为此任务所做的更复杂。

Apple不支持重用视图(在本例中为UITableView实例)。 UITableViewController文档中没有提到它,但在UITableViewController documentation regarding the view property中提到了它。可以说,UITableViewController的tableView属性应该被Apple标记为 readonly ,其tableView只能在内部进行管理,但可能有一个很好的理由不这样做。