如何在使用 Swift 关闭 ViewController 期间将值从 ViewController B 传递给 ViewController A? [复制]
Posted
技术标签:
【中文标题】如何在使用 Swift 关闭 ViewController 期间将值从 ViewController B 传递给 ViewController A? [复制]【英文标题】:How to pass the value from ViewController B to ViewController A during dismiss ViewController using Swift? [duplicate] 【发布时间】:2019-04-26 04:41:01 【问题描述】:我的场景,我试图在关闭视图控制器期间将值从 ViewController B
传递到 ViewController A
。这里我使用了下面的代码,但我无法获取ViewController A
中的值。
ViewController B
// protocol used for sending data back
protocol isAbleToReceiveData
func pass(data: String) //data: string is an example parameter
// Making this a weak variable so that it won't create a strong reference cycle
var delegate: isAbleToReceiveData?
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(true)
self.delegate?.pass(data: "someData") //call the func in the previous vc
@IBAction func Click_action(_ sender: Any)
self.dismiss(animated: false, completion: nil)
self.delegate?.pass(data: "someData")
ViewController A
class MyViewController: UIViewController, isAbleToReceiveData
func pass(data: String)
print("USER: \(data)")
// MARK: FromTouch Action
@objc func fromTouchTapped(_ sender: UITapGestureRecognizer)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "ViewControllerB")
viewController.modalTransitionStyle = .crossDissolve
let navController = UINavigationController(rootViewController: viewController)
present(navController, animated: true, completion: nil)
【问题讨论】:
你需要在 ViewController A 中创建协议,而不是在 ViewController B 中... @Mr.Ahtazaz 他想将数据从 VC_B 发送到 VC_A。所以他的代表是正确的。 你只需要添加行obj_VC_B. delegate = self
哦,对不起,是的,是的,@dahiya_boy 是对的......
你可以在不使用委托的情况下做到这一点,检查这个Link
【参考方案1】:
您错过的一切都是正确的
if let VC_B = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB
VC_B.delegate = self
VC_B.modalTransitionStyle = .crossDissolve
self.present(VC_B, animated: true, completion: nil)
注意
让 viewController = self.storyboard?.instantiateViewController(withIdentifier: “ViewControllerB”)作为?视图控制器B
代替
让 viewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerB")
【讨论】:
如果我给出,我得到错误:'UIViewController' 类型的值没有成员'delegate'。 @Nikunj Kumbhani @jackios 请检查您的 ViewControllerB 类名,您需要在存在时将其放入 MyViewController。 @jackios 请从有问题的 MyViewController 添加您的 ViewcontrollerB 类名和当前控制器的代码,因为由于将 ViewController 作为UIViewController 虽然存在,但如果你想传递任何东西,那么你需要通过类名获取控制器。 ViewcontrollerB.delegate = self 如果我在 Viewcontroller A 中的当前 viewcontrollerB 之前添加,我收到错误:实例成员 'delegate' 不能用于类型 'ViewcontrollerB' @Nikunj Kumbhani @jackios 你的第二个 ViewController 的类名是什么,你为一个礼物写了错误的代码,这就是为什么会出错?【参考方案2】:您的 ViewController A 看起来不错,但似乎您没有设置 ViewController B 的 delegate
变量,请在启动 ViewController B 后执行,如下所示:
viewControllerA.present(viewControllerB, animated: true)
viewControllerB.delegate = viewControllerA // notice this line
由于您在viewControllerA
的实例中,请将viewControllerA
替换为self
下面的完整委托示例
protocol IsAbleToReceiveData: class
func pass(data: String) //data: string is an example parameter
class ViewControllerA: UIViewController, IsAbleToReceiveData
override func viewDidLoad()
super.viewDidLoad()
let button = UIButton(frame: CGRect(x: 15, y: 100, width: 0, height: 0))
button.addTarget(self, action: #selector(launchAction), for: .touchUpInside)
button.setTitle("Launch ViewController B", for: .normal)
button.setTitleColor(.black, for: .normal)
button.sizeToFit()
self.view.addSubview(button)
@objc func launchAction()
let viewController = ViewControllerB() // guard let viewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB else return
viewController.delegate = self
self.present(viewController, animated: true)
func pass(data: String)
print("Received Data: \(data)")
class ViewControllerB: UIViewController
weak var delegate: IsAbleToReceiveData?
override func viewDidLoad()
super.viewDidLoad()
self.view.backgroundColor = .white
let button = UIButton(frame: CGRect(x: 15, y: 100, width: 0, height: 0))
button.addTarget(self, action: #selector(exitAction), for: .touchUpInside)
button.setTitle("Exit ViewController B", for: .normal)
button.setTitleColor(.black, for: .normal)
button.sizeToFit()
self.view.addSubview(button)
@objc func exitAction()
self.delegate?.pass(data: "Hello World!")
self.dismiss(animated: true)
func pass(data: String)
print("Received Data: \(data)")
【讨论】:
我有点困惑。我更新了我的问题,请检查上面。 ViewController A 到 B 然后 B 到 A 的运动发生在我的应用程序中。 ViewController B 到 A 时我需要将值从 B 传递到 A.@AamirR 查看更新和示例项目github.com/r-aamir/delegates_delegation 感谢您提供出色的示例代码答案。它的工作和更有帮助。@ AamirR【参考方案3】:第一个 B 应该有一个指向 A 的委托变量。这意味着它们必须是直接连接,例如 A 是 B 的父级。
如果 A 和 B 之间没有直接连接,另一个简单的解决方案是使用通知中心。其中 B 生成一个事件, A 向该事件添加观察者。你可以按照这个例子:Using Notification Center In Swift
【讨论】:
以上是关于如何在使用 Swift 关闭 ViewController 期间将值从 ViewController B 传递给 ViewController A? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在iOS8中使用Swift更改特定ViewControllers的状态栏颜色