首页 > 解决方案 > 如何在视图之间传递数据。我什么时候应该使用什么?

问题描述

我有一个像这样的视图层次结构:

  • UIViewController ( SingleEventViewController )
    • UIScrollView (事件滚动视图)
      • 界面视图(内容视图
        • 3xUITableView(SurePeopleTV、MaybePeopleTV、NopePeopleTV(都继承自同一个 UITableView))和所有其他 UI 元素

SingleEventViewController 存储一个事件(在初始化程序中传递)。(所有事件都存储在核心数据中)。

这三个UITableViews用于显示参与(或不参与或可能参与)活动的用户。我的问题是,用数据填充 tableViews 的可能性是什么,在这种情况下你会推荐什么。


目前我parentVC: SingleEventViewController在所有子视图中都有一个属性并获取如下数据:

override func loadUsers() {
//class SurePeopleTV
    guard let parentController = parentVC else { return }
    users = (parentController.thisEvent.eventSureParticipants?.allObjects as! [User])
    finishedLoading = true
    super.loadUsers()
}

.

func applyDefaultValues() {
//class EventScrollView
    guard let parent = parentVC else { return }
    titleLabel.text = parent.eventName
}

我是编程新手,但我觉得我不应该在我的所有类中创建 parentVC 引用。

标签: iosswiftuitableviewinheritanceparent-child

解决方案


一个对象不应该(理想情况下)知道它的父对象——如果知道的话,它们是“紧密耦合的”。如果您更改对象的父对象,您的代码可能会中断。在您的情况下,您的父对象必须具有thisEvent属性。

您希望您的对象“松散耦合”,因此该对象不知道特定的父对象。

在 Swift 中,传递信息“备份链”的常用方法是使用委托设计模式…… <a href="https://developer.apple.com/documentation/swift/cocoa_design_patterns" rel="nofollow noreferrer" >https://developer.apple.com/documentation/swift/cocoa_design_patterns 或使用闭包。

有关委托的信息,另请参见https://www.andrewcbancroft.com/2015/04/08/how-delegation-works-a-swift-developer-guide/


推荐阅读