[英]How Pass Data back a view controller in the stack?
我已經在這個類別中看到了很多問題,但是它們似乎都以相同的方式回答,這只是在視圖控制器之間傳遞數據,這並不是我想要的。
我有在其中存儲數據的VC1,在特定情況下,用戶需要在VC2中獲取全部信息。 我需要將該信息傳遞回VC1,稱為數據“ info”
我希望使用的代碼是這樣的。 我訪問VC堆棧,並將變量分配給可選的“ info”變量(在編譯時,堆棧不知道VC類型是堆棧中的哪種類型。
let nav = self.navigationController
let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1]
****//code that isn't working
nextView.info = self.info => Value of type 'UIViewController?' has no member 'info'
****//This works fine
nav?.popViewController(animated: true)
你需要投
if let let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? VCName {
nextView.info = self.info
}
假設您處於導航堆棧中,並且位於您下方的視圖控制器就是您要與之交談的視圖控制器,這是脆弱的。
我的猜測是以前的視圖控制器推動了您的工作,並為您提供了您正在編輯的數據。
在兩個視圖控制器之間設置一個委托協議,並在推送之前讓自己成為新的視圖控制器的委托,這樣會更好/更清潔。 然后它將只向其委托發送一條消息以將數據傳回。
nextView
被認為是它的超類UIViewController
因為UINavigationController
viewControllers
數組是這樣定義的( [UIViewController]
)。
如果您的VC1是FirstVC
類型( UIViewController
子類),則應將其FirstVC
為它的實際類,以便“看到”您的其他屬性。 下一個視圖控制器也是如此。 那么,如果執行此操作會怎樣?
let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? SecondVC
當然,假設您的nextView
是SecondVC
類。 請記住,面向對象的編程具有多態性 ,在這種情況下,所有視圖控制器都是UIViewController
后代,因此,它們通常是UIViewController
在這種情況下可能會發生。
無論如何,正確的方法是定義一個協議,使FirstVC
符合該協議,將第一視圖控制器作為參數傳遞給SecondVC
,然后在第二視圖控制器中,當選擇一個協議時,將協議方法返回給第一視圖控制器。選項。 就像是:
protocol PassDataBackProtocol {
var result: String
}
class FirstVC: UIViewController, PassDataBackProtocol {
var result: String = "" {
didSet {
// Update your view
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondVC = segue.destination as? SecondVC {
secondVC.firstVC = self
}
}
}
class SecondVC: UIViewController {
weak var firstVC: PassDataBackProtocol?
func didChangeValue(newValue: String) {
firstVC?.result = newValue
navigationController?.popViewController(animated: true)
}
}
如果您使用的是pushViewController(_:animated:)
而不是segues, firstVC
在執行推送之前設置firstVC
。
編輯:我將weak
屬性添加到后指針,因為避免保留子彈很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.