我正在尝试使用委托首次实现控制器之间的通信。
我有一个FirstViewController,它会在几秒钟后启动FooTwoViewController,然后FooTwoViewController将一些字符串发回给调用Controller的
。我已经实现了它,但是发现我的委托方法没有被调用,或者我实现不正确。
请在下面查看我的代码:
import UIKit
protocol FooTwoViewControllerDelegate:class {
func myVCDidFinish(_ controller: FooTwoViewController, text: String)
}
class FirstViewController: UIViewController, FooTwoViewControllerDelegate {
var textRecieved = ""
override func viewDidLoad() {
super.viewDidLoad()
// This launches FooTwoViewController after 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController =
storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
self.present(secondViewController, animated: true, completion: nil)
}
}
func myVCDidFinish(_ controller: FooTwoViewController, text: String) {
// THIS DOES NOT PRINT, WHAT AM I MISSING?
print("Data received: \(text)")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "mySegue" {
let vc = segue.destination as! FooTwoViewController
vc.delegate = self
}
}
}
下面的我的FooTwoViewController:
import UIKit
class FooTwoViewController: UIViewController {
weak var delegate: FooTwoViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func ClickMe(_ sender: Any) {
delegate?.myVCDidFinish(self, text: "hey!") //assuming the delegate is assigned otherwise error
self.dismiss(animated: true, completion: nil)
}
}
我的myVCDidFinish方法没有被调用,请问我有什么遗漏吗?
答案 0 :(得分:0)
您需要在此处设置delegate
let secondViewController = storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
secondViewController.delegate = self
self.present(secondViewController, animated: true, completion: nil)
因为prepare(for segue
仅用performSegue
来调用
self.performSegue(withIdentifier:"mySegue",sender:nil)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "mySegue" {
let vc = segue.destination as! FooTwoViewController
vc.delegate = self
}
}
答案 1 :(得分:0)
您实际上不是在执行segue。
代替:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
self.present(secondViewController, animated: true, completion: nil)
}
替换为:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
self.performSegue(withIdentifier: "mySegue", sender: self)
}
并确保界面开发器中已安装适当的序列。