【问题标题】:Cocoa Swift - Pass data from two ViewControllersCocoa Swift - 从两个 ViewController 传递数据
【发布时间】:2021-11-30 08:08:42
【问题描述】:

我正在使用协议和委托将数据从一个 viewController 传递到另一个 viewController,但是当我单击发送时,它只会更改 viewController 而不会传递数据。

有人知道如何将数据从 ViewController B 返回到 ViewController A 吗?

它编译和工作正常,但没有记录,所以我不知道它是否有效。

//  FirstViewController.swift

import Cocoa

class FirstViewController: NSViewController, DataEnteredDelegate {


    @IBOutlet weak var buttonPasswordState: NSView!

    @IBOutlet weak var label: NSTextField!
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

   }


@IBAction func buttonPasswordState(_ sender: Any) {
        
        if let controller = self.storyboard?.instantiateController(withIdentifier: "SecondViewController") as? SecondViewController {
        self.view.window?.contentViewController = controller
        }
        
    }
    
    

    func userDidEnterInformation(info: String) {
            label.stringValue = info
        }


}
//  SecondViewController.swift

import Cocoa

class SecondViewController: NSViewController {

    @IBOutlet weak var buttonContinue: NSButton!

    weak var delegate: DataEnteredDelegate? = nil
    
    @IBOutlet weak var textField: NSTextField!
    

    
    override func viewDidLoad() {
        super.viewDidLoad()
 
    }

@IBAction func buttonContinue(_ sender: Any) {
        
        if let controller = self.storyboard?.instantiateController(withIdentifier: "FirstViewController") as? FirstViewController {
        self.view.window?.contentViewController = controller
            

            delegate?.userDidEnterInformation(info: textField.stringValue)
        }
        
       
    }
    
    
    
}


protocol DataEnteredDelegate: class {
    func userDidEnterInformation(info: String)
}

【问题讨论】:

  • 如果某些东西按预期工作,为什么要记录它?如果需要确定,请尝试在带断点的调试中运行。
  • controller.delegate = self

标签: swift cocoa nsviewcontroller pass-data


【解决方案1】:

你在这里创建了一个全新的 SecondViewController 实例,在你展示它之前没有配置或更改:

    if let controller = self.storyboard?.instantiateController(withIdentifier: "SecondViewController") as? SecondViewController {
    // TODO something like controller.configureWith(dataFromFirstVC)... e.g. controller.delegate = self
    self.view.window?.contentViewController = controller
    }

当您想返回您的 FirstViewController 时,再次创建一个全新的 FirstViewController 实例,您不会回调同一个实例 - 那是您的委托:

    if let controller = self.storyboard?.instantiateController(withIdentifier: "FirstViewController") as? FirstViewController {
    self.view.window?.contentViewController = controller
        // controller is not the same object as delegate

        delegate?.userDidEnterInformation(info: textField.stringValue)
    }
    

【讨论】:

    【解决方案2】:

    我想这会对你有所帮助。

    class FirstViewController: UIViewController, DataPassProtocol {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                self.fireSecondViewController()
            }
        
        }
    
        func fireSecondViewController() {
            let secondViewController = SecondViewController()
            secondViewController.delegateFirstViewController = self
        }
    
        // MARK: - protocol methods
        func dataCaptured(with value: SampleData) {
            // we captured data from secondViewController
            print("data : \(value.temp)")
        }
    }
    
    class SecondViewController: UIViewController {
    
        weak var delegateFirstViewController: DataPassProtocol?
    
        override func viewDidLoad() {
            super.viewDidLoad()
        
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                self.sendSomeDataToFirstViewController()
            }
        
        }
    
        func sendSomeDataToFirstViewController() {
            delegateFirstViewController?.dataCaptured(with: SampleData(temp: "Tadaaaaaaa"))
        }
    }
    
    struct SampleData {
        let temp: String
    }
    
    protocol DataPassProtocol: AnyObject {
        func dataCaptured(with value: SampleData)
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多