如何使用Swift Delegate模式在视图之间传输数据

问题描述 投票:0回答:1

我是一名学习iOS的学生我们正在使用Delegate实现视图之间的数据传输。

但是我不明白为什么不传递数据。

我应该修复哪个部分?

而且我不想使用segue。

伟大的开发人员,分享您的知识!

我想将数据从LoginVC发送到ShowCompanyVC。

//LoginVC Source...
import UIKit

protocol DataDelegate: class {
    func sendData(data: String)
}

class LoginVC: UIViewController {

    @IBOutlet weak var bizNumTF: UITextField!

    weak var delegate: DataDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func LoginButton(_ sender: UIButton) {
        delegate?.sendData(data: "Data")
        guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
        self.present(vc, animated: true, completion: nil)
    }}

}

ShowCompanyVC来源...

import UIKit

class ShowCompanyVC: UIViewController, DataDelegate {

    @IBOutlet weak var testLabel: UILabel!

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

    func sendData(data: String) {
        print(data)
        testLabel.text = data
    }
}

ios swift view delegates
1个回答
0
投票

在这种情况下,您实际上不需要委托。

实例化ShowCompanyVC控制器后,您可以直接发送任何数据。

class ShowCompanyVC: UIViewController, DataDelegate {

   var dataToBeReceived: String? // insert here the data type you expect to receive
   ...
}

class LoginVC: UIViewController {

    @IBAction func LoginButton(_ sender: UIButton) {
        guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
        vc.dataToBeReceived = "any data"
        self.present(vc, animated: true, completion: nil)
    }}

}


0
投票

首先,最大的问题是您的“ self.delegate”为零,原因有二:

  1. 您没有将其分配给任何东西,因此您的参数“ delegate”仍然为零。

  2. “ ShowCompanyVC”将在委托函数“ sendData”之后实例化,这意味着您错过了分配委托的机会。

在这种情况下,我不会求助于委托,我建议您像@Glenn所建议的那样,更多地研究委托/代理。

我可能会更直接地解决您的问题:

class LoginVC: UIViewController {

@IBOutlet weak var bizNumTF: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func LoginButton(_ sender: UIButton) {
    guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
    vc.data = "Data"
    self.present(vc, animated: true, completion: nil)
}}

}

import UIKit

class ShowCompanyVC: UIViewController, DataDelegate {

//MARK: - IBOutlets

@IBOutlet weak var testLabel: UILabel!

//MARK: - Properties

var data: AnyObject?

override func viewDidLoad() {
    super.viewDidLoad()
    if let data = data as? String {
        self.sendData(data: data)
    }
}

func sendData(data: String) {

    print(data)
    testLabel.text = data
}

}

© www.soinside.com 2019 - 2024. All rights reserved.