【发布时间】:2018-12-18 15:17:05
【问题描述】:
我正在尝试在 viewWillDisappear 函数中使用 unwind segue 更改标签文本。每次调用 viewWillDisappear 函数时,它都会自动跳过我的 unwind segue 行而不是执行它。
我正在使用 Xcode 9 和 Swift 4.2
这些是我的代码:
主页ViewController.swift
import UIKit
import Foundation
struct globalConstant {
let lostMessage : String = "You Lost!"
let welcomeMessage : String = "WELCOME"
let playAgainMessage : String = "Play again"
let resumeMessage : String = "Resume"
let pausedMessage : String = "Game is paused"
let playMessage : String = "Play Game"
}
class ViewController: UIViewController {
var globalConst = globalConstant()
var labelValue : String!
//start Outlet
@IBOutlet weak var mainLabel: UILabel!
@IBOutlet weak var startButton: UIButton!
//end Outlet
@IBAction func unwindFromGame(_ sender: UIStoryboardSegue){
let gameController = sender.source as? gamePageViewController
if (gameController?.balVariables.balanceValue)! <= 0{
mainLabel.text = gameController?.balVariables.abc
}
else {
mainLabel.text = self.globalConst.pausedMessage
}
}
}
我的第二页gamePageViewController.swift
import UIKit
import Foundation
struct balanceVariables {
//declare var start
var initBalance : Int = 500
var balanceValue : Int = 0
let abc = "abc"
//declare var end
}
class gamePageViewController: UIViewController {
// override func addChild(_ gamePageViewController: UIViewController) {
// }
@IBOutlet weak var valueHolder: UILabel!
var balVariables = balanceVariables()
override func viewDidLoad() {
super.viewDidLoad()
//run on page load
if balVariables.balanceValue <= 0 {
balVariables.balanceValue = balVariables.initBalance
valueHolder.text = String(balVariables.balanceValue)
}else{
balVariables.balanceValue = balVariables.balanceValue
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
performSegue(withIdentifier: "unwindFromGame", sender: self)
}
// override func didMove(toParent ViewController: UIViewController?){
// performSegue(withIdentifier: "unwindFromGame", sender: self)
// }
}
这是我的故事板配置的图像
(对于 unwind segue 连接,我 ctrl+拖动 View Controller 图标
gamePageViewController 中的退出图标)
如前所述,我无法让 performSegue 在viewWillDisappear 中运行。
我在这里想要实现的是,当我单击 NavigationBar 上的后退按钮时,viewWillDisappear 将拦截并执行对调用 unwindFromGame 并更改 mainLabel 的主 ViewController 的展开 segue。
从gameViewController.swift 的代码中,您会注意到我已经注释掉了didMove(toParent)。使用这种方法,我可以让我的performSegue 运行,它成功地从gamePageViewController 检索到abc 变量,但问题是它加载了页面但没有等待我在后退按钮上的提示。相反,它会自动运行 didMove(toParent) 并将我发送回主屏幕,并编辑 mainLabel。我也尝试过willMove(toParent),得到了同样的结果。
我的问题是:
我如何让viewWillDisappear 中的performSegue 运行?
这是与 iPhone X / iPhone Xs Max 相关的问题吗?
使用didMove(toParent) 或willMove(toParent),如何让它等待返回按钮上的提示?
假设它无法与 NavigationBar Back Button 一起使用。自定义 NavigationBar Back Button 会达到预期的效果吗?如果是这样,我该怎么做?
您是否建议切换到 Swift 4 而不是 4.2?
非常感谢。
【问题讨论】: