【问题标题】:Is it possible to re-assign an existing UITableView to a different UITableViewController?是否可以将现有的 UITableView 重新分配给不同的 UITableViewController?
【发布时间】:2014-08-07 19:31:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否也尝试将 UITableView 添加到 UITableViewController 的视图中?
  • @MarcusAdams 您的意思是将 UITableView 分配为 TVC 的视图,还是将其添加为子视图? TVC 理想情况下没有自己的视图,因为它应该只是分配的 tableView。我没有明确设置它,因为我假设 UITableViewController 的默认 setTableView 会为我设置它。在调试时检查它似乎证实了这一点。

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


【解决方案1】:

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

【讨论】:

  • TVC 拥有不同类型的数据,具有不同的单元类型、源对象类等。这不仅仅是原始数据的刷新甚至是原始数据的子集。为了理智起见,它们是独立的控制器是有道理的。你的第二点是对的:由于麻烦,没有一个真正令人信服的理由来重用视图。容器视图的设置很复杂,但毫无疑问,在层次结构中交换两个独立的 TVC 管理的 UITableView 会更容易、更简单。
【解决方案2】:

答案是,原因如下:

我检查了调试器,正常的 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 只在内部进行管理,但它可能有一个很好的理由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 2022-01-20
    • 1970-01-01
    • 2018-02-12
    • 2013-03-23
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多