Swift - 放松Segue传递数据混乱

时间:2017-04-24 02:52:43

标签: swift segue prepare unwind-segue

我已尝试以多种方式从我的unwind segue向后传递数据。看起来数据没有被发送或者在viewDidLoad()之后被发送,所以我试图设置的标签没有得到更新。 unwind segue正在工作,下面我使用准备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
    }
}

如果我需要为我正在尝试的内容添加更多详细信息,请询问并编辑。我想问这个问题,但我在制定方面遇到了麻烦。

1 个答案:

答案 0 :(得分:1)

  

似乎数据没有被发送或者在viewDidLoad()之后发送,所以我试图设置的标签没有得到更新。

展开segue 中,您将返回已经创建的viewController,因此viewDidLoad在您之前发生了viewController之前发生了dismiss

如果您正在使用segues,则不应该使用navigationController中的viewControllers数组或调用prepare(for:sender:)展开segue 将完成所有这些工作。只需在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

为:

var rectX = 500;
var rectWidth = 200;
var rectHeight = 100;
var centerX = rectX + rectWidth / 2;
var pointToUse = Math.floor(centerX / (w / points.length));