我有一个这样的View-Hierarchy:
- UIViewController( SingleEventViewController )
- UIScrollView( EventScrollView )
- UIView( contentView )
- 3xUITableView(SurePeopleTV,MaybePeopleTV,NopePeopleTV(均从同一UITableView继承))和所有其他UI元素
SingleEventViewController存储一个事件(在初始化程序中传递)。 (所有事件都存储在Core-Data中)。
三个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引用。
答案 0 :(得分:2)
一个对象不应该(理想地)知道其父对象-如果确实如此,则它们是“紧密耦合的”。如果更改对象的父对象,则代码可能会中断。在您的情况下,您的父对象必须具有thisEvent
属性。
您希望对象“松散耦合”,因此该对象不知道特定的父对象。
在Swift中,传递信息“备份链”的通常方法是使用委托设计模式…https://developer.apple.com/documentation/swift/cocoa_design_patterns或使用闭包。
有关委派的信息,另请参见https://www.andrewcbancroft.com/2015/04/08/how-delegation-works-a-swift-developer-guide/
答案 1 :(得分:1)
首先,如果创建对父级ViewController的引用,请确保该引用是弱的,否则会遇到内存管理问题。
编辑:如Ashley Mills所说,委托处理此问题的方式