iOS 未调用委托方法
iOS delegate method not called
我第一次尝试使用委派实现控制器之间的通信。
我有一个 FirstViewController,它会在几秒钟后启动 FooTwoViewController,然后 FooTwoViewController 将一些字符串发送回调用控制器。
我已经实现了它,但我发现我的委托方法没有被调用或者我错误地实现了它。
请看下面我的代码:
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 方法没有被调用,请问我遗漏了什么吗?
这里需要设置delegate
let secondViewController = storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
secondViewController.delegate = self
self.present(secondViewController, animated: true, completion: nil)
as 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
}
}
您实际上并没有执行转场。
而不是:
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)
}
并确保 segue 在 Interface Builder 中就位。
我第一次尝试使用委派实现控制器之间的通信。
我有一个 FirstViewController,它会在几秒钟后启动 FooTwoViewController,然后 FooTwoViewController 将一些字符串发送回调用控制器。
我已经实现了它,但我发现我的委托方法没有被调用或者我错误地实现了它。
请看下面我的代码:
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 方法没有被调用,请问我遗漏了什么吗?
这里需要设置delegate
let secondViewController = storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
secondViewController.delegate = self
self.present(secondViewController, animated: true, completion: nil)
as 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
}
}
您实际上并没有执行转场。
而不是:
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)
}
并确保 segue 在 Interface Builder 中就位。