[英]Pass data from the first VC to the third (Swift)
我有3個viewControllers,我以這種方式將數據從第一個傳遞到第二個(這是第一個VC)
var steppers : UIStepper?
@IBOutlet weak var hourLabel: UILabel!
@IBOutlet weak var stepper: UIStepper!
@IBAction func stepper(_ sender: UIStepper) {
hourLabel.text = String(sender.value)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nc = segue.destination as? SelectClass {
nc.limit = Int(stepper.value)
} }
在第二個VC中,我的var limit = 0
。 直到這里一切都工作良好,但我要做的是將用戶提供給步進器的值傳遞給第三個VC。 我試圖在第三個VC var limit2 = 0
創建另一個變量,並以這種方式將數據從第二個VC傳遞到第三個VC。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? ThirdClass {
vc.limit2 = limit
} }
但沒有結果,我的var limit2 = 0
它始終具有值0,而不是采用步進器添加的值。 我能怎么做?
這是第二個VC中的准備
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == nearbySearchSegueIdentifier {
guard let category = sender as? QCategoryy else {
return
}
if let selectedRows = tableView.indexPathsForSelectedRows {
if let vc = segue.destination as? ThirdClass {
vc.category = category
vc.limit2 = limit
}
}
}
}
從第一到第二到第三,你為什么不通過?
FirstVC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "tosecondsegue" {
let itemController : Second = segue.destination as! Second
itemController.limit = 0 //Whatever you want
}
}
SecondVC:
var limit = 0
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "tothirdsegue" {
let itemController : ThirdVC = segue.destination as! ThirdVC
itemController.limit2 = limit
}
}
ThirdVC:
var limit2 = 0
//Use it here now
考慮到您當前的代碼 ,因為此條件無效,可能未設置limit2 :
// This condition could be failing sometimes
if let selectedRows = tableView.indexPathsForSelectedRows {
if let vc = segue.destination as? ThirdClass {
vc.category = category
vc.limit2 = limit
}
}
根據文檔 , indexPathsForSelectedRows
返回一個可選值,並且在您的設置中,如果該值不為nil,則僅設置limit2 。
嘗試將 limit2 設置在任何條件之外,因此它將始終執行,如果您需要滿足條件才能進行segue
,請在此處檢查shouldPerformSegue(withIdentifier:sender:)
。
另外,如果在VC3上需要的值與離開VC1時的值相同,則可以使用不同的方法在它們之間傳遞數據,而不必依賴VC2。
一種可能是在VC1中創建一個靜態變量並設置極限值,然后再推送到VC2:
var steppers : UIStepper?
@IBOutlet weak var hourLabel: UILabel!
@IBOutlet weak var stepper: UIStepper!
// ADD THIS
static var globalLimit: Int = 0
@IBAction func stepper(_ sender: UIStepper) {
hourLabel.text = String(sender.value)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nc = segue.destination as? SelectClass {
nc.limit = Int(stepper.value)
// AND THIS
VC1ClassName.globalLimit = Int(stepper.value)
}
}
然后在VC3內部隨時隨地加載您的全局值(也許是viewDidLoad
):
override func viewDidLoad() {
super.viewDidLoad()
limit2 = VC1ClassName.globalLimit
}
除了讓數據通過ViewControllers傳遞之外,您還可以創建一個StepperManager類或類似的負責數據管理的類,並且可以隨時從所需的每個類中訪問它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.