如何在使用Swift反转Segue时在iOS中传递信息?

时间:2014-06-19 03:42:40

标签: storyboard swift ios8

我有两个视图控制器,一个和两个。我从VC One转到VC Two。在VC Two上,我选择了一些存储在数组中的数据。当我按导航栏上的“后退”按钮时,我想将该阵列发送回VC One。

使用Swift& amp;和/或故事板?

谢谢!

3 个答案:

答案 0 :(得分:26)

如果您使用“完成”和“取消”按钮(有点像选择器)呈现模态视图,则在展开segue方法期间获取该值可能是最简单的。

鉴于您要使用导航控制器的本机后退按钮,最佳做法可能是实现VC One可以遵循的协议,然后在VC二上的数据后立即更新VC One被选中。类似的东西:

在VCTwo.swift中:

protocol VCTwoDelegate {
    func updateData(data: String)
}

class VCTwo : UIViewController {
    var delegate: VCTwoDelegate?
    ...
    @IBAction func choiceMade(sender: AnyObject) {
        // do the things
        self.delegate?.updateData(self.data)
    }
    ...
}

并在VCOne.swift中:

class VCOne: ViewController {
    ...
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "VCTwoSegue" {
            (segue.destinationViewController as VCTwo).delegate = self
        }
    }
    ...
}

extension VCOne: VCTwoDelegate {
    func updateData(data: String) {
        self.internalData = data
    }
}

答案 1 :(得分:6)

您还可以使用通知设计模式(Post& Observe),它主要用于将相同的对象/信息从一个VC传递到多个视图控制器。

针对您的场景: 在VC2.swift中:

@IBAction func BackBtn(sender: UIButton) {  
  NSNotificationCenter.defaultCenter().postNotificationName("ThisIsTheMessage", object: nil, userInfo:["ObjectBeingSent":yourObject])

}

在VC1.swift中:

override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("yourFunction:"), name: "ThisIsTheMessage", object: nil)
    }



func yourFunction(theNotification : NSNotification) {

           if let extractInfo = theNotification.userInfo {
     //code to use the object sent from VC2, by extracting the object details
    }
     }

答案 2 :(得分:1)

这是我在Swift 3中的解决方案

1)在SecondController.swift文件中创建一个协议。我们最好创建协议,从中获取数据。

protocol Protocol {
        func passingDataBack(withString: String)
}   

2)创建Protocol

类型的变量
var proto: Protocol!

3)切换到ViewController.swift文件并继承我们从SecondController.swift文件制作的协议。

class ViewController: UIViewController, Protocol {

}   

4)然后,我们希望通过创建我们创建的函数来符合我们制定的协议

    func passingDataBack(withString: String) {
//        withString will return the value that has been passed from our SecondController class
        self.title = withString

    }

5)使用prepareForSegue方法并segue到SecondController类

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as? SecondController
        vc?.proto = self //This line will instantiate the protocol to our ViewController class
    }

6)返回我们的SecondController.swift文件并使用didSelectRow方法传递我们的数据

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    proto.passingDataBack(withString: items[indexPath.row]) //Call the protocol and the function then pass our data.
    _ = self.navigationController?.popViewController(animated: true) //This will pop back to our previous controller.

}

*重要的事情要记住!!! *

从controllerA切换到controllerB时,必须将协议从controllerB设置为实例化到controllerA

在我们的示例中,我们从ViewController移动到SecondController。我们通过

从SecondController实例化我们的协议
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as? SecondController
    vc?.proto = self //This line will instantiate the protocol to our ViewController class
}

如果你不这样做,你将在这一行上收到一个线程001错误

proto.passingDataBack(withString: items[indexPath.row]) //Call the protocol and the function then pass our data.

源代码Github