如何在视图之间传递数据。我什么时候应该使用什么?

时间:2018-09-26 08:20:22

标签: ios swift uitableview inheritance parent-child

我有一个这样的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引用。

2 个答案:

答案 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所说,委托处理此问题的方式

在ViewController之间传递数据的推荐方法是使用类似的 每次从视图控制器执行搜索时,都会调用此函数。此代码首先检查segue的标识符,如果您想要的标识符,则可以访问对下一个视图控制器的引用并将数据传递给它。