当前位置: 首页 > 知识库问答 >
问题:

协议委托未按预期传递数据[Swift5]

易自珍
2023-03-14

我已经创建了一个简单的协议委托来将数据从一个视图控制器传递到第二个视图控制器--但是数据似乎没有传递出去?

详细信息:第一个视图控制器有一个textField,我在其中键入数据(字符串),以传递给第二个VC。我也有一个按钮的动作触发过渡到第二视图控制器。第二个视图控制器出现,但来自第一个视图控制器的数据没有显示出来-预期的行为是第二个VC中的标签用来自第一个VC的数据更新。我还创建了一个从FVC到SVC的segue按钮,其标识符为'send dataidentifier'。

我做错了什么?

下面的代码和截图:

第一视图控制器

import UIKit

protocol SendDataDelegte {
    func sendData(data: String)
}

class FirstViewController: UIViewController {

    var delegate: SendDataDelegte? = nil

    @IBOutlet weak var dataCaptured: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func sendDataButton(_ sender: Any) {
        let dataToBeSent = self.dataCaptured.text
        self.delegate?.sendData(data: dataToBeSent!)
    }
}

第二视图控制器

import UIKit

class SecondViewController: UIViewController, SendDataDelegte {

    @IBOutlet weak var dataRetrived: UILabel!
    @IBAction func closeButton(_ sender: Any) {
         dismiss(animated: true, completion: nil)
    }

    func sendData(data: String) {
        self.dataRetrived.text = data
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "sendDataIdentifier" {
            let firstVC: FirstViewController = segue.destination as! FirstViewController
            firstVC.delegate = self
        }
    }
}

共有1个答案

劳嘉实
2023-03-14

你搞错了方向。

在此实例中不需要委托模式。您需要在第一个视图控制器中实现prepare(for segue)并将数据传递到目标视图控制器。

在目标视图控制器中未调用prepare(for segue),并且在第一个视图控制器中,delegate属性将为nil,因为没有设置它。

class FirstViewController: UIViewController {

    @IBOutlet weak var dataCaptured: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let dest = segue.destination as? SecondViewController {
            dest.text = self.dataCaptured.text
        }
    }
}

class SecondViewController: UIViewController, SendDataDelegte {

    @IBOutlet weak var dataRetrived: UILabel!
    var text: String?
    @IBAction func closeButton(_ sender: Any) {
         dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated:Bool) {
        super.viewWillAppear(animated)
        self.dataRetrieved.text = text
    }
}

 类似资料:
  • 我有一个奇怪的错误,我的代表是零,也不知道在哪里检查。也许其他人也有同样的问题。 我有这个类和协议: 在我的VC里 触发计划通知后,我单击它,调用并且不知为何为零,即使已设置委托(打印了来自的消息)。 扩展中的委托方法从未触发,因为委托为nil。 我还在每个类的中打印了一些消息,以查看它是否以某种方式从内存中删除了,但它们没有,只是在我从vc堆栈中弹出它们之后。

  • null null 我从Stephen Cleary的博客上读到,Task.run应该只用于CPU绑定的操作,显然上传一大块数据不是CPU绑定的。因此,如果我在 中调用 ,似乎是一种错误的方式。 所以我的问题是,使用Task.Run来包装和调用异步函数是不是一种不好的做法?

  • 我已经创建了一个通用的Spring批处理作业,用于处理数据并存储到CSV中。我需要从读取器传递到写入器的一些数据,这是我试图使用JobExecution来做的。然而令人惊讶的是,代码似乎首先调用getWriter()而不是getReader()函数。下面给出了我的配置。有人能解释为什么会发生这种情况,以及是否有其他方法将数据从读取器传递到写入器。 我想从读取器传递到写入器的数据是CSV的列名。由于

  • 问题内容: Java相当于Cocoa委托的代表? (我知道我可以将一个接口传递给一个类,并让该类调用适当的方法,但是我想知道是否还有其他方法可以实现更接近于Cocoa / Objective- C的非正式协议的东西) 问题答案: 简短的答案是,Java中没有什么比您想的要近的了,但还有其他选择。委托模式并不难实现,只是不像使用Objective-C那样方便。 “非正式协议”在Objective-C

  • 问题内容: 在Interface Builder中无法将声明为@IBOutlet的委托属性连接到–根本无法建立连接。 这是代码 由于使用了快速协议,因此IBOutlet属性不能具有非对象类型,不知道为什么不起作用。 还有其他人遇到过这样的事情吗? 问题答案: 从Xcode发行说明中: 当插座的类型是协议时,Interface Builder不支持连接到Swift文件中的插座。 解决方法:将插座的类

  • 问题内容: 当我使用ssh命令手动连接到主机时,一切正常: 但是使用paramiko总是失败: paramiko脚本: paramiko版本:1.9.0 为什么会引发“协议错误:预期的数据包SSH_MSG_USERAUTH_REQUEST,得到SSH_MSG_SERVICE_REQUEST”错误?如何避免呢? 问题答案: TL; DR: 将此添加:和/或添加到您的呼叫中。 通过对此进行一些研究,我