【问题标题】:How can I send data back to the first view controller after detecting that the back button was pressed?检测到按下后退按钮后,如何将数据发送回第一个视图控制器?
【发布时间】:2019-08-09 10:29:27
【问题描述】:

现在使用委托模式传输数据:

我已经实现了这个功能:

 var overviewController = addOverview()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    overviewController.delegate = self
}

func setValues(){
    overview.name = buildingName.text!
    overview.city = city.text!
    overview.contact = contactName.text!
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM-dd-yyyy"
    overview.date = dateFormatter.string(from: datePicker.date)
    overview.email = email.text!
    overview.building = buildingTypes[buildingPicker.selectedRow(inComponent: 0)]
    overview.freq = cleaningFreqs[cleaningFreqPicker.selectedRow(inComponent: 0)]
    overview.phone = phoneNumber.text!
    overview.sft = sqFt.text!
    overview.state = State.text!
    overview.street = street.text!
}



// MARK: - Navigation

override func willMove(toParent parent: UIViewController?) {
    super.willMove(toParent:parent)
    if parent == nil {
        setValues()
        print("Hello")
        delegate?.setValues(obj: overview)
    }
}

这里是我编写的协议中的 setValues:

func setValues(obj: overviewProps){
    overview = obj
}

但是在打印对象的一个​​属性之后,数据并没有被传输。

【问题讨论】:

    标签: ios swift uinavigationcontroller segue


    【解决方案1】:

    您可以使用委托模式或使用观察者模式。请参阅这些示例以获取帮助。

    编辑:根据您的代码使用委托

    协议

    protocol SetValueDelegate {
        func didFinishSetValue(obj: Overview)
    }
    

    第一个视图控制器

    class FirstViewController: UIViewController, SetValueDelegate {
    
       var secondViewController = SecondViewContrller()
    
       override func viewDidLoad() {
           super.viewDidLoad()
           secondViewController?.delegate = self
       }
    
       func didFinishSetValue(obj: Overview) {
           // when it comes back to the first screen you can use ->> obj data
       }
    
    }
    

    第二个视图控制器

    class SecondViewController: UIViewController {
       var delegate: SetValueDelegate?
    
       override func viewDidLoad() {
           super.viewDidLoad()
           …
       }
       override func willMove(toParent parent: UIViewController?) {
          super.willMove(toParent: parent)
          if parent == nil {
             setValues()
             …
             self.delegate?.didFinishSetValue(obj: overview)
          }
       }
    
    }
    

    【讨论】:

    • 我实现了委托协议,但数据仍未保存回初始视图控制器。但是我测试了按下后退按钮时该代码正在运行。
    • 我觉得你的case和这个项目差不多,可以关注这个:github.com/chhaileng/LoginDelegeteHomework
    • 所以我实际上是使用 segue 去视图,我应该像你在代码中那样呈现它吗?
    • 我刚刚更新了我的答案,你可以检查并尝试一下。
    • 好的,我已经查明了问题,问题是协议中列出的方法没有执行
    【解决方案2】:

    有很多方法可以在两个 viewController 之间传递/交换数据。我不知道您的实现如何。但是您可以使用委托模式来实现您的目标。当您想要传递数据时,使用委托并触发方法。

    正如我所说,还有其他解决方案。但这取决于你,你想选择哪一个。

    【讨论】:

    • 我可以在我的帖子中添加什么来帮助您和其他人理解它?
    • 你可以在你的代码中实现委托模式。它不取决于您如何实现代码,它会起作用。而委托模式在 iOS 开发中非常重要。你最终必须使用它。我找到了这个博客,learnappmaking.com/…,在这里,作者提到了各种方式(前向和后向数据传递,包括委托模式),这对你理解很有帮助。
    • 我使用该链接添加了委托模式,谢谢!但是,代码仍然无法按预期工作,因为数据没有被传回。我已经更新了我的代码来显示这个
    【解决方案3】:

    使用导航设计在当前视图和根视图之间传递数据的正确方法是触发展开转场。

    看看下面的文章。它在 Swift 3 中,但它应该为您将其转换为 Swift 4.2 提供了一个良好的开端

    https://link.medium.com/b4eFIx7LaV

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2016-03-15
      相关资源
      最近更新 更多