Ios 是否可以将现有UITableView重新分配给其他UITableViewController?

Ios 是否可以将现有UITableView重新分配给其他UITableViewController?,ios,objective-c,cocoa-touch,uitableview,uikit,Ios,Objective C,Cocoa Touch,Uitableview,Uikit,我的大多数应用程序都是以编程方式创建的,但我有一些复杂的视图是使用Interface Builder创建的,并以编程方式加载 在一个视图中,我以编程方式创建了一个UITableViewController子类,它的tableView属性被分配给XIB中的UITableView实例,引用为IBOutlet。这发生在XIB的UIViewController的viewDidLoad中,并且表视图显示正确 有一次,我需要更改表视图的全部内容。理想情况下,我希望断开该视图与第一个UITableViewCo

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

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

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


老实说,我知道表视图实例通常由UITableViewController管理。我在文档中找不到任何关于setTableView在指定的tableView中自动设置委托和数据源的反向引用的内容,因此我很惊讶我的外部创建的tableView一开始就可以工作。事实上,TVC文档似乎将UITableViewController的tableView属性讨论为只读,即使它没有标记为只读。

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

答案是否定的,原因如下:

我使用调试器进行了检查,正常的setTableView会在self上设置view属性,并在新传入的tableView上设置委托和数据源属性。苹果公司没有对此进行记录,但这是一种假设行为,因此一切都很好

我没有意识到的是,默认的setView(来自UIViewController)将在设置新视图之前从其superview中删除现有视图。为了防止“一次一个视图控制器”运行时错误,我将旧TVC的tableView设置为nil,这导致我打算重用的tableView从视图层次结构中删除。为了避免这种行为,必须重写setView,这比我在执行此任务时所关心的要复杂得多


Apple不支持重用视图(在本例中为UITableView实例)。UITableViewController文档中没有提到它,但在中提到了它。可以说,UtableViewController的tableView属性应由Apple标记为只读,其tableView由内部单独管理,但这可能是一个很好的原因。

您是否也尝试将UtableView添加到UtableViewController的视图中?@MarcusAdams您的意思是将UtableView指定为TVC的视图,还是将其添加为子视图?TVC理想情况下没有自己的视图,因为它应该是指定的tableView。我没有明确设置它,因为我假设UITableViewController的默认setTableView会为我设置它。调试时检查它似乎证实了这一点。TVCs持有不同类型的数据,具有不同的单元格类型、源对象类等。它不仅仅是刷新,甚至不是原始数据的子集。为了理智起见,它们是独立的控制器是有道理的。您的第二点是对的:由于问题,没有真正令人信服的理由重用视图。容器视图的设置很复杂,但在层次结构中交换两个单独的TVC托管UITableView无疑会更容易,也不会那么复杂。