我试图通过委托(delegate)在Swift
中的两个Container Views
之间发送信息,但我不断收到展开错误执行协议(protocol)功能时。
topContainerViewController.swift
import UIKit
protocol topContainerDelegate{
func send(text:String)
}
class topContainerViewController: UIViewController {
var delegate: topContainerDelegate! = nil
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func sendMessage(sender: AnyObject) {
delegate!.send(textField.text!)
}
}
bottomContainerViewController.swift
import UIKit
class bottomContainerViewController: UIViewController, topContainerDelegate {
@IBOutlet var messageLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
func send(text: String) {
messageLabel.text = text
}
}
问题
如何在两个容器 View 之间正确设置委派?
最佳答案
您的代码的问题是:
- 您从未在
BottomContainerViewController
中将委托(delegate)设置为self
。 - 在您的
TopContainerViewController
中,您将委托(delegate)初始值设置为 nil,只需将其保留为可选并使用防护来解开它。
这在我的测试应用程序中有效:
protocol TopContainerDelegate : class {
func send(text:String)
}
class TopContainerViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
weak var delegate : TopContainerDelegate?
@IBAction func sendMessage(sender: UIButton) {
guard let delegate = delegate else {
return
}
delegate.send(textField.text!)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
class BottomContainerViewController: UIViewController, TopContainerDelegate {
@IBOutlet weak var messageLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let app = UIApplication.sharedApplication().delegate! as! AppDelegate
if let viewControllers = app.window?.rootViewController?.childViewControllers {
viewControllers.forEach { vc in
if let cont = vc as? TopContainerViewController {
cont.delegate = self
}
}
}
}
func send(text:String) {
messageLabel.text = text
}
}
如果您还有任何其他问题,请随时下载我的工作项目并亲自测试一下。
Download Working Example
关于ios - 两个容器 View 之间的委派,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937985/