我有两个视图控制器,一个和两个。我从VC One转到VC Two。在VC Two上,我选择了一些存储在数组中的数据。当我按导航栏上的“后退”按钮时,我想将该阵列发送回VC One。
使用Swift& amp;和/或故事板?
谢谢!
答案 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