gamePageViewController

gamePageViewController

我正在尝试用“在视图中展开分段将消失”功能更改标签文本。每次调用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退出图标
swift - 在viewWill中快速展开segue消失在NavigationBar上的后退按钮已单击-LMLPHP
如前所述,我无法让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的标识符与ViewControllergamePageViewController之间的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)
}

10-08 07:29