ios - 两个容器 View 之间的委派

标签 ios swift delegates protocols

我试图通过委托(delegate)Swift中的两个Container Views之间发送信息,但我不断收到展开错误执行协议(protocol)功能时。

my story board layout

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/

相关文章:

ios - 如何禁用 iOS Mail App 文本放大

ios - 自定义高度未应用于 UITableView 原型(prototype)单元格

ios - Singleton类中的Init方法(Objective-C)

xcode - 代码将在 Xcode 上构建,但不会在 Playground 上运行。为什么?

ios - 正则表达式不允许字符串 swift ios 中出现空格

ios - 从 swift 中的 NSObject 类执行 UIViewController 中的函数

ios - 如何通过iOS Swift中的回调函数发送JSON响应数据?

ios - 如何在我的 AppDelegate.swift 中向 Workmanager 注册 "specific plug-in"?

ios - Dwifft 和 ReactiveCocoa

ios - UIPageViewController 委托(delegate)不触发横向