我正在尝试用“在视图中展开分段将消失”功能更改标签文本。每次调用viewwilldiscover函数时,它都会自动跳过我的展开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)
// }
}
这是我故事板配置的图像
(对于展开segue连接,I ctrl+拖动视图控制器图标
在
gamePageViewController
退出图标如前所述,我无法让performSegue在
viewWillDisappear
中运行。我在这里要实现的是,当我单击导航栏上的后退按钮时,
viewWillDisappear
将截取并执行主ViewController的展开部分,主ViewController调用unwindFromGame
并更改mainLabel
。从
gameViewController.swift
中的代码中,您会注意到我已经注释掉了didMove(toParent)
。使用这个方法,我可以让我的performSegue
运行,它成功地从abc
中检索到gamePageViewController
变量,但问题是它加载了页面,但没有等待我返回按钮上的提示。相反,它会自动运行didMove(toParent)
并将我发送回主屏幕,同时编辑mainLabel
。我也试过willMove(toParent)
,也得到了同样的结果。我的问题是:
如何让
performSegue
中的viewWillDisappear
运行?这是与iPhone X/iPhone Xs Max相关的问题吗?
使用
didMove(toParent)
或willMove(toParent)
,如何让它等待“后退”按钮上的提示?假设无法使用导航栏的“后退”按钮。自定义导航栏后退按钮是否能达到预期效果?如果是,我该怎么做?
你建议换成斯威夫特4而不是4.2吗?
非常感谢你。
最佳答案
让我们尝试使用委托模式,而不是使用展开segue。
首先为您的gamePageViewController
创建委托协议并声明发送balanceVariables
的函数
protocol GamePageDelegate {
func sendBalVariable(_ variable: balanceVariables)
}
现在在您的
delegate
中创建gamePageViewController
变量class gamePageViewController: UIViewController {
var delegate: GamePageDelegate?
...
}
然后将此委托实现到您的
ViewController
并声明当您对委托调用此方法时应发生的事情class ViewController: UIViewController, GamePageDelegate {
...
func sendBalVariable(_ variable: balanceVariables) {
if variable.balanceValue <= 0 {
mainLabel.text = variables.abc
} else {
mainLabel.text = self.globalConst.pausedMessage
}
/* mainLabel.text = variable.balanceValue <= 0 ? variables.abc : self.globalConst.pausedMessage */
}
}
现在覆盖
prepare(for:sender:)
中的ViewController
,并将目的地的delegate
设置为self
(如果segue的标识符与ViewController
和gamePageViewController
之间的segue的标识符匹配)override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "yourIdentifier" {
let destinationVC = segue.destination as! gamePageViewController
destinationVC.delegate = self
}
}
最后,在您的
gamePageViewController
调用delegate方法时,视图将消失,ass参数传递balVariables
override func viewWillDisappear(_ animated: Bool) {
delegate?.sendBalVariable(balVariables)
}