在两个容器视图之间进行委派 [英] Delegation between two container views

查看:71
本文介绍了在两个容器视图之间进行委派的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过代理<2>在 Swift 中的两个容器视图之间发送信息。 / strong>,执行协议功能时,我会不断收到展开错误

I'm trying to send information between two Container Views in Swift, through a delegate and I keep getting unwrapping error when performing the protocol function.

我的故事板布局

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
    }
}



问题



如何正确设置两个容器视图之间的委托?

Question

How do I properly set up delegation between two container views?

推荐答案

您的代码存在问题是:


  • 您从未在<$ c中将委托设置为 self $ c> BottomContainerViewController 。

  • 在您的 TopContainerViewController 中,将代表的初始值设置为nil,然后离开

  • you were never setting your delegate to self in your BottomContainerViewController.
  • In your TopContainerViewController you set your delegates initial value to nil, just leave it as an optional and use a guard to unwrap it.

在我的测试应用程序中有效:

This works in my test application:

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
    }
}

如果还有其他问题问题可以随时下载我的工作项目并自己进行测试。

If you have any further questions feel free to download my working project and test it out for yourself.

这篇关于在两个容器视图之间进行委派的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆