[英]How to pass data back to view control from modal view controller
所以通常我会为此使用委托模式,但这是一个棘手的情况。
视图控制器A呈现->视图控制器B呈现->视图控制器C。
当用户完成视图控制器C中的步骤后,我将在一次调用中关闭B和C
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
我想将数据从视图控制器C传回给A。这怎么可能,由于A没有对C的引用,如何实现委托?
****编辑:这都是以编程方式完成的,所以我不能使用放松的顺序
*****解决方案*******
我发现的最佳解决方案是在VC中添加一个观察器,然后在关闭VC时将对象发布到VC C中:
self.presentingViewController?.presentingViewController?.dismiss(animated: true) {
NotificationCenter.default.post(name: Notification.Name("UpdateKeywords"), object: self.account)
}
不要忘记在deinit()中删除VC A中的观察者
我通常要做的是在b中创建对A的引用,然后在C中创建对该引用的引用,然后在返回A之前,对引用进行更改,然后调用self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
您可以使用单例设计模式。 声明一个单例类的数据。
class DatasSingleton{
static let sharedInstance = DatasSingletonSingleton()
var datas: int = 0
}
在C类中,您设置数据
class C{
func xyz(){
DatasSingleton.sharedInstance.datas = 6
}
}
在A类中,您可以读取数据
class A{
func xyz(){
print(DatasSingleton.sharedInstance.datas)
}
}
示例代码VC A当前VC B,VC B当前VC C,在VC C上输入文本,然后调用VC A的方法(此处传输数据),并在VC C输入文本。请参见下文。 ..
希望能有所帮助
(Xcode 8.1(8B62):在Info.plist中删除情节提要,启动屏幕,清理属性主情节提要和启动屏幕,并将AppDelegate.swift替换为以下内容)
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window!.rootViewController = Avc()
self.window!.makeKeyAndVisible()
return true
}
}
class Avc: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let b = self.view.addSubviewWithConstraints(["b" : Button(title: "Open B VC")], constraints: ["V:|-10-[b(70)]", "H:|-10-[b]-10-|"])["b"]
(b as! Button).action = {() in
let bvc = Bvc()
bvc.action = self.receiveData
self.present(bvc, animated: false,completion: nil)
}
}
func receiveData(data: String?) {
print(data)
}
}
class Bvc: UIViewController {
var action: ((_ data: String?)->())!
override func viewDidLoad() {
super.viewDidLoad()
let b = self.view.addSubviewWithConstraints(["b" : Button(title: "Open C VC")], constraints: ["V:|-10-[b(70)]", "H:|-10-[b]-10-|"])["b"]
(b as! Button).action = {() in
let cvc = Cvc()
cvc.action = self.action
self.present(cvc, animated: false,completion: nil)
}
}
}
class Cvc: UIViewController {
var action: ((_ data:String?)->())!
override func viewDidLoad() {
super.viewDidLoad()
let t = self.view.addSubviewWithConstraints(["t" : UITextField()], constraints: ["V:|-50-[t(24)]", "H:|-10-[t]-10-|"])["t"]
(t as! UITextField).backgroundColor = UIColor.white
let b = self.view.addSubviewWithConstraints(["b" : Button(title: "Transfer data to A VC")], constraints: ["V:|-100-[b(90)]", "H:|-10-[b]-10-|"])["b"]
(b as! Button).action = {() in
self.presentingViewController?.dismiss(animated: true, completion: nil)
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
self.action((t as! UITextField).text)
}
}
}
class Button: UIButton {
var action: (()->())!
init(title: String) {
super.init(frame : CGRect.zero)
self.setTitle(title, for: UIControlState())
self.addTarget(self, action: #selector(Button.buttonAction(_:)), for: .touchUpInside)
}
required init?(coder: NSCoder) {super.init(coder: coder)}
func buttonAction(_ sender: AnyObject) {if action != nil {action()}}
}
extension UIView {
func addSubviewWithConstraints(_ views: [String : AnyObject], constraints: Array<String>) -> [String : AnyObject] {
for (_, view) in views {
self.addSubview(view as! UIView)
(view as! UIView).translatesAutoresizingMaskIntoConstraints = false
}
for i in 0 ..< constraints.count {self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: constraints[i], options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))}
return views
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.