如何在关闭 ViewController 时将数据传递给另一个控制器?
How to pass data to another controller on dismiss ViewController?
我想在 VC 关闭时将我的数据从一个 ViewController
传递到另一个 VC。可能吗?
我已经尝试了下一个方法,但没有成功:
点击按钮时:
self.dismiss(animated: true) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "EditViewController") as! EditViewController
controller.segueArray = [values]
}
当EditViewController
再次出现时,我的segueArray
在nil
那里
如何在关闭时将我的数据从 my ViewController
传递到 EditViewController
?
将数据传回前一个视图控制器的最佳方法是通过委托...从 ViewController A 到 B 时,将视图控制器 A 作为委托传递给 [= 的 viewWillDisappear 方法22=] B,调用 ViewController A 中的委托方法.. 协议将有助于定义委托和需要由之前的 VC 实现的方法。这是一个简单的例子:
传递数据的协议:
protocol isAbleToReceiveData {
func pass(data: String) //data: string is an example parameter
}
Viewcontroller答:
class viewControllerA: UIViewController, isAbleToReceiveData {
func pass(data: String) { //conforms to protocol
// implement your own implementation
}
prepare(for: Segue) {
/** code for passing data **/
let vc2 = ViewCOntrollerB() /
vc2.delegate = self //sets the delegate in the new viewcontroller
//before displaying
present(vc2)
}
}
正在关闭 viewcontroller:
class viewControllerB: UIViewController {
var delegate: isAbleToReceiveData
viewWillDisappear {
delegate.pass(data: "someData") //call the func in the previous vc
}
}
在关闭完成块中,您创建了 EditViewController 的新实例。我假设导航堆栈中存在另一个 EditViewController 实例,您需要找到该实例并将 segueArray 设置为值。
您可以通过遍历导航堆栈的 viewcontroller 来实现,例如:
viewController.navigationController?.viewControllers.forEach({ (vc) in
if let editVC = vc as? EditViewController {
editVC.segueArray = ....
}
})
但我建议使用委托模式,例如:
protocol EditViewControllerDelegate: class {
func setSegueArray(segues: [UIStoryboardSegue])
}
在关闭块所在的 viewcontroller(简称为 ViewController)中,声明一个委托 属性:
class ViewController: UIViewController {
weak var delegate: EditViewControllerDelegate?
....
}
然后在呈现实例时(我从 EditViewController 假设)ViewController 将委托设置为:
...
if let vc = presentingViewController as? ViewController {
vc.delegate = self
}
并使 EditViewController 符合委托协议,例如:
extension EditViewController: EditViewControllerDelegate {
func setSegueArray(segues: [UIStoryboardSegue]) {
// Do the data setting here eg. self.segues = segues
}
}
为了检测视图控制器上的后退按钮何时被按下,我只使用:
override func didMove(toParentViewController parent: UIViewController?) {
guard parent == nil else { return } // Back button pressed
... // Pass on the info as shown in you example
} // didMoveToParentViewController
通用解决方案:( Swift 5.1 )
/**
* Returns a ViewController of a class Kind
* ## Examples:
* UIView.vc(vcKind: CustomViewController.self) // ref to an instance of CustomViewController
*/
public static func vc<T: UIViewController>(vcKind: T.Type? = nil) -> T? {
guard let appDelegate = UIApplication.shared.delegate, let window = appDelegate.window else { return nil }
if let vc = window?.rootViewController as? T {
return vc
} else if let vc = window?.rootViewController?.presentedViewController as? T {
return vc
} else if let vc = window?.rootViewController?.children {
return vc.lazy.compactMap { [=10=] as? T }.first
}
return nil
}
我想在 VC 关闭时将我的数据从一个 ViewController
传递到另一个 VC。可能吗?
我已经尝试了下一个方法,但没有成功:
点击按钮时:
self.dismiss(animated: true) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "EditViewController") as! EditViewController
controller.segueArray = [values]
}
当EditViewController
再次出现时,我的segueArray
在nil
那里
如何在关闭时将我的数据从 my ViewController
传递到 EditViewController
?
将数据传回前一个视图控制器的最佳方法是通过委托...从 ViewController A 到 B 时,将视图控制器 A 作为委托传递给 [= 的 viewWillDisappear 方法22=] B,调用 ViewController A 中的委托方法.. 协议将有助于定义委托和需要由之前的 VC 实现的方法。这是一个简单的例子:
传递数据的协议:
protocol isAbleToReceiveData {
func pass(data: String) //data: string is an example parameter
}
Viewcontroller答:
class viewControllerA: UIViewController, isAbleToReceiveData {
func pass(data: String) { //conforms to protocol
// implement your own implementation
}
prepare(for: Segue) {
/** code for passing data **/
let vc2 = ViewCOntrollerB() /
vc2.delegate = self //sets the delegate in the new viewcontroller
//before displaying
present(vc2)
}
}
正在关闭 viewcontroller:
class viewControllerB: UIViewController {
var delegate: isAbleToReceiveData
viewWillDisappear {
delegate.pass(data: "someData") //call the func in the previous vc
}
}
在关闭完成块中,您创建了 EditViewController 的新实例。我假设导航堆栈中存在另一个 EditViewController 实例,您需要找到该实例并将 segueArray 设置为值。 您可以通过遍历导航堆栈的 viewcontroller 来实现,例如:
viewController.navigationController?.viewControllers.forEach({ (vc) in
if let editVC = vc as? EditViewController {
editVC.segueArray = ....
}
})
但我建议使用委托模式,例如:
protocol EditViewControllerDelegate: class {
func setSegueArray(segues: [UIStoryboardSegue])
}
在关闭块所在的 viewcontroller(简称为 ViewController)中,声明一个委托 属性:
class ViewController: UIViewController {
weak var delegate: EditViewControllerDelegate?
....
}
然后在呈现实例时(我从 EditViewController 假设)ViewController 将委托设置为:
...
if let vc = presentingViewController as? ViewController {
vc.delegate = self
}
并使 EditViewController 符合委托协议,例如:
extension EditViewController: EditViewControllerDelegate {
func setSegueArray(segues: [UIStoryboardSegue]) {
// Do the data setting here eg. self.segues = segues
}
}
为了检测视图控制器上的后退按钮何时被按下,我只使用:
override func didMove(toParentViewController parent: UIViewController?) {
guard parent == nil else { return } // Back button pressed
... // Pass on the info as shown in you example
} // didMoveToParentViewController
通用解决方案:( Swift 5.1 )
/**
* Returns a ViewController of a class Kind
* ## Examples:
* UIView.vc(vcKind: CustomViewController.self) // ref to an instance of CustomViewController
*/
public static func vc<T: UIViewController>(vcKind: T.Type? = nil) -> T? {
guard let appDelegate = UIApplication.shared.delegate, let window = appDelegate.window else { return nil }
if let vc = window?.rootViewController as? T {
return vc
} else if let vc = window?.rootViewController?.presentedViewController as? T {
return vc
} else if let vc = window?.rootViewController?.children {
return vc.lazy.compactMap { [=10=] as? T }.first
}
return nil
}