我正在使用協議和委托將資料從一個 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)
}
uj5u.com熱心網友回復:
您正在此處創建一個全新的 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)
}
uj5u.com熱心網友回復:
我認為這會對你有所幫助。
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)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/323427.html
