如何在使用 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在swift中使用协议实现并发线程? [关闭]

以编程方式 Swift Segue

如何在 Swift 中创建一个圆形按钮? [关闭]

在iOS8中使用Swift更改特定ViewControllers的状态栏颜色

如何使用 Swift 处理错误(FileManager 和其他一般)[关闭]

如何使用swift在ios中动态/编程添加多个UITableView? [关闭]