加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 尝试理解Swift中的协议/委托

发布时间:2020-12-15 01:45:29 所属栏目:百科 来源:网络整理
导读:我是编程和新手的新手. Swift和我试图了解如何在两个视图控制器(没有segue)之间传递数据与协议和委托. 我有一个视图控制器(视图A),它有一个文本字段和按钮.当用户点击该按钮时,它应该在另一个视图控制器(VIEW B)的标签中显示该文本. 我无法获得标签来显示文
我是编程和新手的新手. Swift和我试图了解如何在两个视图控制器(没有segue)之间传递数据与协议和委托.

我有一个视图控制器(视图A),它有一个文本字段和按钮.当用户点击该按钮时,它应该在另一个视图控制器(VIEW B)的标签中显示该文本.

我无法获得标签来显示文本 – 我希望能够解释为使这项工作成为必要.

非常感谢!

import UIKit

            protocol sendNameToViewB {

                func showNameLabel(name:String)
            }

            class ViewA: UIViewController {

                var delegate: sendNameToViewB?

                @IBOutlet weak var textField: UITextField!

                @IBAction func addButton(sender: AnyObject) {
                    delegate?.showNameLabel(textField.text)

                }
                 override func viewDidLoad() {
                    super.viewDidLoad()

                    // Do any additional setup after loading the view,typically from a nib.
                }
                override func didReceiveMemoryWarning() {
                    super.didReceiveMemoryWarning()
                    // Dispose of any resources that can be recreated.
                }


            }

            class ViewB: UIViewController,sendNameToViewB {

                @IBOutlet weak var theLabel: UILabel!

                func showNameLabel(name: String) {
                    theLabel.text = name
                }
            }

解决方法

首先,注意:视图控制器的名称应在名称中包含“ViewController”.从UIView继承的类集合完全不同.命名视图控制器只是ViewA使得它看起来像一个视图而不是视图控制器.视图位于应用程序的完全不同的层中.

现在,要将数据传递给另一个对象,您的第一个要求是在它们之间有一个引用.可以在任一方向上设置此引用.

一种可能性是让ViewControllerA保持对ViewControllerB的引用.通过此引用,ViewControllerA可以在按下按钮时调用ViewControllerB上的方法,该方法将您想要传递的数据作为参数传递.

class ViewControllerA: UIViewController {
    @IBOutlet weak var viewControllerB: ViewControllerB!

    @IBAction func addButton(sender: AnyObject) {
        self.viewControllerB.showNameLabel(textField.text)
    }
}

另一种可能性是使用像标题所暗示的委托模式.这将涉及ViewControllerB,它具有对ViewControllerA的引用.优选地,这不是直接了解ViewControllerA类,而是通过协议.该协议将定义一个方法,该方法返回您想要“传递”到ViewControllerB的数据.这样,ViewContollerB可以在其“委托”(恰好是ViewControllerA)上调用协议方法来获取所需的数据.

protocol ViewControllerBDelegate {
    func requiredText() -> String
}

class ViewControllerB: UIViewController {
    @IBOutlet weak var delegate: ViewControllerBDelegate?

    override func viewDidLoad() {
        if let actualDelegate = self.delegate {
            self.theLabel.text = actualDelegate.requiredText()
        }
    }
}

您选择哪种方法实际上取决于您在这种情况下的需求.委托模式更好地保持您的对象不那么耦合在一起,但如果您已经需要从ViewControllerA“触发”ViewControllerB上发生的事情,那么可能需要更直接的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读