【问题标题】:Using protocols to pass data使用协议传递数据
【发布时间】:2015-12-31 17:49:21
【问题描述】:

我读过Trying to understand protocol/delegates in SwiftPassing data back from view controllers XcodePass data when dismiss modal viewController in swift,试图来回传递一些数据。我想我完全按照帖子中的描述做了,数据没有被传递。我错过了一些东西,我不知道是什么。如果你能指出那是什么,那就太棒了。提前谢谢你:)

我还应该提到,我使用模态 segue 呈现了TaskMessageViewController。我想将数据发送回我的TaskListViewController。我目前正在使用unwindToSegue 回到TaskListViewController

在我的Protocols.swift 文件中,我有以下代码:

import Foundation

protocol ReceiveMessageDelegate {
    func receiveMessageFromTaskMessageViewController (message: String)
}

在我的继承声明中,我有:

class TaskListViewController: UIViewController, ReceiveMessageDelegate

在我的TaskListViewController.swift 中,我写道:

override func viewDidLoad() {
    super.viewDidLoad()

    let taskMessageViewController = TaskMessageViewController()
    taskMessageViewController.delegate = self

}

func receiveMessageFromTaskMessageViewController (message: String) {
    print(message)
    print("Protocol works!")
}

在我的TaskMessageViewController.swift 中,我写道:

var delegate: ReceiveMessageDelegate?
@IBAction func doneButtonTapped(sender: AnyObject) {
    self.delegate?.receiveMessageFromTaskMessageViewController("message from message View Controller")
}

当我按下模拟器上的done 按钮时,doneButtonTapped 会被执行。但是,print("Protocol Works") 永远不会被执行。有人有什么建议吗?

【问题讨论】:

  • 如何以模态方式呈现视图控制器?如果是通过segue,则需要拦截segue的destinationViewController,将其转换为TaskMessageViewController,并在该对象上设置委托
  • 我已经使用 segue 以模态方式呈现了视图控制器。但问题是我使用unwindToSegue 摆脱了模态视图,我试图将数据从模态视图传递回我的视图控制器。

标签: ios swift protocols


【解决方案1】:

当您想在视图控制器之间快速传递消息时,您通常不需要创建自己的协议。如果您在关闭模态视图控制器时尝试传递数据,通常可以通过识别 segue 的源视图控制器来识别呈现的视图控制器并访问其属性。

在这种情况下,没有打印消息的原因是因为您将 self 分配给实例“taskMessageViewController”的委托,这是 viewDidLoad() 方法的本地常量,并且 taskMessageViewController 永远不会逃避 viewDidLoad() .你永远不会设置 self 的委托。

【讨论】:

  • 这是一个很好的观点。所以我做了let taskMessageViewController = TaskMessageViewController() override func viewDidLoad() { super.viewDidLoad() taskMessageViewController.delegate = self } 但是,这仍然没有导致打印语句执行:( 换句话说,我在videwDidLoad 函数之外声明了let taskMessageViewController = TaskMessageViewController()
  • 原因是因为您在 self 的委托上调用方法 receiveMessageFromTaskMessageViewController,而不是在您设置的 taskMessageViewController 的委托上。你从不设置 self 的委托。
【解决方案2】:

我再次阅读了您的问题。我看到你正在使用unwind segue。所以你不需要委托来传回消息。你应该这样做:

TaskMessageViewController.swift中,定义一个变量message,然后覆盖函数prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "identifierUnwind" {
        message = message
    }
}

还有你的TaskListViewController.swift,你可以得到它:

@IBAction func unwindToSegue (segue : UIStoryboardSegue) {
      if let taskMessageViewController = segue.sourceViewController as? TaskMessageViewController 
         print(taskMessageViewController.message)
         //OR save and do anything with it here.
      } 
 }

【讨论】:

  • 我将以下代码放入我的TaskListViewController.swift@IBAction func unwindToSegue (segue : UIStoryboardSegue) { if let taskMessageViewController = segue.sourceViewController as? TaskMessageViewController { taskMessageViewController.delegate = self } }
  • 但是,这仍然没有导致打印语句执行。
  • 你可以添加到@IBAction func doneButtonTapped(sender: AnyObject)这一行:print(self.delegate?)并给我结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多