簡體   English   中英

如何將數據傳遞回堆棧中的視圖控制器?

[英]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

當然,假設您的nextViewSecondVC類。 請記住,面向對象的編程具有多態性 ,在這種情況下,所有視圖控制器都是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM