如何实现两个ViewController之间的委托快速使用segue?

时间:2018-08-10 17:28:38

标签: swift segue protocols delegation

enter image description here

我有点使abt授权迅速混乱。说,如果我想将BViewController中的文本字段的文本传递给AViewController。 (AViewController有一个标签,但是我没有放置任何文本,因此它在那里什么都没有显示。)用户完成输入并单击“ LETS GO”按钮后,AViewController中的标签文本应显示相同的文本。我实现了代码,但它给了我一些错误。谢谢。

代码:

import UIKit

class AViewController: UIViewController, BViewDelegate {


    @IBOutlet weak var labelTextData: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()


    }

    func userDoneInput(textData: String) {
        labelTextData.text = textData
    }



}




import UIKit

protocol BViewDelegate{
    func userDoneInput(textData: String)
}

class BViewController: UIViewController {


    @IBOutlet weak var UserInputText: UITextField!
    var bViewDelegate: BViewDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()


    }


    @IBAction func LetsGo(_ sender: UIButton) {
       self.performSegue(withIdentifier: "ShowData", sender: self)

    }

    //use segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier  == "ShowData" {
            let destination = segue.destination as! AViewController
            destination.labelTextData.text = UserInputText.text

        }
    }

}

3 个答案:

答案 0 :(得分:1)

1- A表演

2-对B执行委托时,在此处设置委托(此代码在A内)

@IBAction func MoveToB (_ sender: UIButton) {
   self.performSegue(withIdentifier: "GoToB", sender: self)

}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier  == "GoToB" {
        let destination = segue.destination as! BViewController
        destination.bViewDelegate = self
    }
}

3-当您想从B返回A时(B内的这段代码)

self.bViewDelegate?.userDoneInput(textData: UserInputText.text!)
self.dismiss(animated:true,completion:nil)

4-从B到A不应有任何联系

答案 1 :(得分:0)

首先,最佳实践是不要使用序列从A返回到B(实际上,您根本没有返回,而是将A的新实例放在B之上)。有多种选择。这是三个:

  • 使用轻松的搜索。
  • 如果您以模态形式呈现B,则调用B的dismiss函数(您的图像表明这是您正在执行的操作,但是代码中缺少它)。
  • 如果您将B显示为导航控制器的一部分,请调用B的navigationController的popViewController(animated :)方法。

在从A呈现B之前,您需要将B的委托属性设置为A(目前不这样做)。 然后你提出B 然后,当用户在B上点击“放手”时,只需调用self.dismiss(或替代方法-参见上面的选项),还可以调用self.delegate.userDoneInput(textData:)。

答案 2 :(得分:0)

这很简单:

Interface Builder设置

A有一个您可以在B中编辑的标签。有两个按钮可让您前后导航。重要的是,请勿按住Ctrl键并单击“返回到A”按钮以选择A。这样做会在层次结构中添加另一个控制器:A表示B,而B表示另一个A。 ,B应自行解散以显示原始A(请参见下面的代码)。

Demo

代码

[x for x in [1,2,3] if x != 2]