我已尝试以多种方式从我的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
}
}
如果我需要为我正在尝试的内容添加更多详细信息,请询问并编辑。我想问这个问题,但我在制定方面遇到了麻烦。
答案 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));