【问题标题】:Swift - Unwind Segue Pass Data ConfusionSwift - 解开 Segue Pass 数据混乱
【发布时间】:2017-04-24 11:10:38
【问题描述】:

我已经尝试以多种方式将数据从我的 unwind segue 向后传递。似乎数据没有被发送或在 viewDidLoad() 之后被发送,所以我试图设置的标签没有得到更新。 unwind segue 正在工作,下面我使用 prepare for segue 成功地将前一个视图控制器的标题更改为“新标题”,但最后一行没有将 nbaRotoHome.player 设置为“新玩家名称”。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "BuyStatsTapPager" {
        let nav = segue.destination as! UINavigationController


        let buyStatsTapPager = nav.viewControllers[0] as! BuyStatsTabPager
            buyStatsTapPager.selectedPlayerBuyStats = selectedPlayer
            buyStatsTapPager.buyStatsRef = self

    }

    if segue.identifier == "unwindToViewController1" {

        var viewControllers: [UIViewController] = mainNavigationController.viewControllers as [UIViewController];

        if(viewControllers.count == 3){
            viewControllers.remove(at: viewControllers.count-2)
            mainNavigationController?.viewControllers = viewControllers
        }

        let enteredContestViewController = viewControllers[viewControllers.count-1]
        enteredContestViewController.title = "new title"

        self.presentingViewController?.dismiss(animated: true, completion: nil)

        let nbaRotoHome = segue.destination as! NBARotoHome

        nbaRotoHome.player = "new player name"


    }

回到我以前的视图控制器我有

@IBAction func prepareForUnwind(segue: UIStoryboardSegue) {


}

看了这个问题之后 Passing data with unwind segue 我也试过在以前的视图控制器中以这种方式获取数据

 @IBAction func prepareForUnwind(segue: UIStoryboardSegue) {
    if let sourceViewController = segue as? BuyStats {
        playerNameLabel.text = sourceViewController.playerName
    }
}

如果我需要为我正在尝试做的事情添加更多细节,请询问,我会进行编辑。我想问这个问题,但我无法制定。

【问题讨论】:

    标签: swift segue prepare unwind-segue


    【解决方案1】:

    似乎数据未发送或在 viewDidLoad() 之后发送,因此我尝试设置的标签未更新。

    unwind segue中,您将返回到已经创建的viewController,所以viewDidLoad 发生在很久以前,在您转到另一个viewController 之前。


    如果您使用 segue,则不应在 navigationController 中处理 viewController 数组或调用 dismissunwind segue 将完成所有这些。只需在prepare(for:sender:) 中获取destination 并设置数据:

    if segue.identifier == "unwindToViewController1" {
    
        let nbaRotoHome = segue.destination as! NBARotoHome
    
        nbaRotoHome.player = "new player name"
    }
    

    或在您的prepareForUnwind 中获取来源 并读取数据:

    在这一行中,您缺少.source。变化:

    if let sourceViewController = segue as? BuyStats
    

    到:

    if let sourceViewController = segue.source as? BuyStats
    

    【讨论】:

    • 感谢您的回复。但是,我仍然遇到麻烦。如果 viewDidLoad() 已经被调用,那么它如何使用新数据进行更新?假设我已经在 viewDidLoad() 中设置了一个标签,现在我想在展开时更改它。是不是还有其他事情需要发生(比如再次调用 viewDidLoad() ),或者是否需要重新分配变量?我已经尝试过了,但没有任何运气。
    • 把更新标签的代码放到自己的方法中。从 viewDidLoad() 和您调用 prepareForUnwind 的展开着陆点调用该方法。
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 2016-01-16
    • 1970-01-01
    • 2011-11-29
    • 2010-11-08
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多