我是 Swift 新手,正在構建一個應用程式來學習。現在我正在制作應用程式的注冊部分。我認為如果有多個 VC 提出一個問題,即一個關于你的名字、一個關于你的生日等問題,而不是將所有這些都塞進一個視圖控制器中,那么用戶體驗會更好。最終的視圖控制器收集所有這些資訊,并將字典作為 FUser 物件發送以保存在 Firebase 上。
我想我可以在前五個視圖控制器中的每一個上實體化最終的視圖控制器,并將該資料直接傳遞到最后。我不斷收到錯誤并發現變數為零。如果我將資料直接傳遞給下一個視圖控制器,它作業得很好,但它似乎不允許我向它發送幾個視圖控制器。顯然,這里的記憶體管理方式存在細微差別,我沒有跟蹤。
有沒有辦法做我想做的事情,或者我必須通過每個視圖控制器傳遞資料?
import UIKit
class FirstViewController: UIViewController {
//MARK: - IBOutlets
@IBOutlet weak var firstNameTextField: UITextField!
//MARK: - ViewLifeCycle
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - IBActions
@IBAction func continueToMiddleViewController(_ sender: Any) {
let vcFinal = storyboard?.instantiateViewController(withIdentifier:
"finalVC") as! finalViewController
vcFinal.firstName = firstNameTextField.text
let vc = storyboard?.instantiateViewController(withIdentifier:
"middleVC") as! middleViewController
vc.modalPresentationStyle = .fullScreen
present(vc, animated: false)
}
...
}
import UIKit
class FinalViewController: UIViewController {
var firstName: String?
...
//MARK: - ViewLifeCycle
override func viewDidLoad() {
super.viewDidLoad()
}
...
}
uj5u.com熱心網友回復:
TL;DR:最快的解決你問題的方法是創建一個單例
為此有很多策略。對于初學者來說,閱讀一些初學者文章可能是個好主意,比如這篇文章。如果您覺得它沒有用,我可以更新這個答案,但它看起來就像文章一樣
uj5u.com熱心網友回復:
Viewcontroller在呼叫任何 init 方法之前,無法啟動 的變數。
這個執行緒上有詳細的答案。
在 ViewController 之間傳遞資料
uj5u.com熱心網友回復:
解決這個問題的另一種方法是使用閉包。請注意,我個人已經不再使用故事板,但我仍會嘗試解釋。閉包也被稱為回呼、塊,或者在某些背景關系中,如這里 - 完成。
您可以像下面這樣宣告一個閉包let onSubmitInfo: (String?) -> Void,它存盤對可以像函式一樣在稍后階段執行的代碼塊的參考,并且它像函式一樣接受可選字串作為引數。
閉包在初始化程式中指定,其中將代碼塊傳遞到下面的相應類中,然后在IBActions 中呼叫閉包,這將觸發在以下類被初始化的地方定義的代碼塊:
class First: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var firstNameTextField: UITextField!
// MARK: - Properties
private let onSubmitInfo: (String?) -> Void
init(onSubmitInfo: (String?) -> Void) {
self.onSubmitInfo = onSubmitInfo
}
// MARK: - IBActions
@IBAction func continue(_ sender: Any) {
onSubmitInfo(firstNameTextField.text)
}
}
class Second: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var lastNameTextField: UITextField!
// MARK: - Properties
private let onSubmitInfo: (String?) -> Void
init(onSubmitInfo: (String?) -> Void) {
self.onSubmitInfo = onSubmitInfo
}
// MARK: - IBActions
@IBAction func continue(_ sender: Any) {
onSubmitInfo(lastNameTextField.text)
}
}
為了管理顯示上述視圖并收集它們的閉包回傳的值(即onSubmitInfo),我們創建了一個FlowController類,該類也將在呼叫閉包時顯示下一個視圖。在我們定義了閉包或代碼塊,當它在上面的相應和類中FlowController被呼叫時要執行。在各自的and類中提供的可選字串用作下面的and閉包屬性:IBActionFirstSecondFirstSecond(firstName)(secondName)
class FlowController: UIViewController {
private var fistName: String?
private var lastName: String?
...
private func showFirstView() {
let firstViewController = First(onSubmitInfo: { (firstName) in
self.firstName = firstName
showSecondView()
})
navigationController?.pushViewController(
firstViewController,
animated: true)
}
private func showSecondView() {
let secondViewController = Second(onSubmitInfo: { (lastName) in
self.lastName = lastName
showFinalView()
})
navigationController?.pushViewController(
secondViewController,
animated: true)
}
private func showFinalView() {
let finalViewController = Final(
firstName: firstName,
lastName: lastName)
navigationController?.pushViewController(
finalViewController,
animated: true)
}
}
FlowControllerfinally在上面的函式中Final收集了視圖控制器的firstName表單和視圖控制器的表單后顯示了視圖控制器。FirstlastNameSecondshowFinalView
class Final: UIViewController {
let firstName: String
let lastName: String
...
}
我希望這是朝著正確方向的推動。我已經放棄了故事板,因為我發現在代碼中創建視圖在同行評審中更加冗長和清晰,而且我也更容易管理約束并且只是管理一般視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483976.html
上一篇:為復數創建我自己的自動裝箱類
