gpt4 book ai didi

swift - 为什么我的prepareForSegue代码激活了错误的按钮?

转载 作者:行者123 更新时间:2023-11-30 13:43:38 25 4
gpt4 key购买 nike

我正在学习如何编程并正在 Xcode 中使用 Swift 项目。主 Storyboard有两个 View Controller 。第一个 View Controller 简称为 ViewController,第二个 View Controller 称为 HelpScreenViewController。

在 ViewController 中,我有一个“帮助”按钮,可以将用户切换到 HelpScreenViewController。此按钮使用名为“goToHelpScreenSegue”的 Segue。

在 HelpScreenViewController 中我有三个按钮:

  • “关闭”按钮可关闭 View (不使用转场)
  • “发送反馈”按钮可在邮件应用中生成新电子邮件(不使用转义)
  • “重置游戏”按钮可调用第一个 ViewController编码的函数。第三个按钮使用名为“resetGameSegue”的 Segue。

我想做的是......

...获取 HelpScreenViewController 上的“重置游戏”按钮,通过调用第一个 View Controller 中编码的函数来重置游戏。*

为了尝试让它按照我想要的方式工作,我使用了以下代码:

在第一个主 ViewController 内

import UIKit
import iAd
import AdSupport
import AVFoundation //audio
import GameplayKit



class ViewController: UIViewController, ADBannerViewDelegate, MyResetGameProtocol {



@IBOutlet weak var Banner: ADBannerView!

@IBOutlet weak var buttonA: UIButton!

@IBOutlet weak var buttonB: UIButton!

@IBOutlet weak var buttonC: UIButton!

@IBOutlet weak var buttonD: UIButton!



@IBOutlet weak var labelQuestion: UILabel!

@IBOutlet weak var labelScore: UILabel!

@IBOutlet weak var labelTotalQuestionsAsked: UILabel!

@IBOutlet weak var labelFeedback: UILabel!



@IBOutlet weak var buttonNext: UIButton!



var score :Int! = 0
var totalquestionsasked :Int! = 0

var allEntries : NSArray!

var shuffledQuestions: [AnyObject]!
var nextQuestion = -1


var currentCorrectAnswerIndex : Int = 0

var audioPlayer = AVAudioPlayer()






override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.


self.Banner?.delegate = self
self.Banner?.hidden = true

LoadAllQuestionsAndAnswers()

if #available(iOS 9.0, *) {
shuffledQuestions = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(allEntries as [AnyObject])
nextQuestion++
LoadQuestion(nextQuestion)

// Fallback on earlier versions
}else{

let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
LoadQuestionPreiOS9(randomNumber)

}


LoadScore()


AdjustInterface()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let viewController = segue.destinationViewController as! HelpScreenViewController
viewController.controller = self
}



func ResetGame() {
PlaySoundReset()
score = 0
totalquestionsasked = 0
SaveScore()
LoadScore()
}

func PlaySoundReset()
{
let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("pcbeep", ofType: "wav")!)

do {
audioPlayer = try AVAudioPlayer(contentsOfURL: alertSound)
} catch {
}
audioPlayer.prepareToPlay()
audioPlayer.play()
}


func SaveScore()
{
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(score, forKey: "Score")
defaults.setInteger(totalquestionsasked, forKey: "Out of")
}

func LoadScore()
{
let defaults = NSUserDefaults.standardUserDefaults()
score = defaults.integerForKey("Score")
totalquestionsasked = defaults.integerForKey("Out of")
labelScore.text = "Score: \(score)"
labelTotalQuestionsAsked.text = "out of \(totalquestionsasked)"
}

等等......

在第二个 HelpScreenViewController 内

import UIKit

protocol MyResetGameProtocol {

func ResetGame()
}


class HelpScreenViewController: UIViewController, MyResetGameProtocol {

var controller: MyResetGameProtocol? // reference to the delegate alias First Controller

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}



/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/


@IBAction func SendFeedback(sender: AnyObject) {

UIApplication.sharedApplication().openURL(NSURL(string: "mailto:feedback@felice.ws?")!)

}


@IBAction func DismissView(sender: AnyObject) {

self.dismissViewControllerAnimated(true, completion: nil) }


@IBAction func buttonResetGame(sender: AnyObject) {
controller.ResetGame()

}

}

现在,使用上面的代码,如果用户点击第一个主 ViewController 中的“帮助”按钮(即 goToHelpScreenSegue),它不仅会将用户带到帮助屏幕,而且还会将用户带到帮助屏幕。当用户点击“重置游戏”按钮时,调用我想要激活的功能。也就是说,目前,“帮助”按钮可以在将用户带到帮助屏幕之前重置游戏。

现在,在帮助屏幕中,前两个按钮可以正常工作(但它们不使用转场)。点击第三个按钮(重置游戏按钮)只需将用户返回到主屏幕。它不会调用该函数,也不会重置游戏。

我已经记不清有多少次更改代码以尝试使其正常工作,但我显然错过了一些非常明显的东西。

特别是,我尝试在主 ViewController 中使用以下代码:

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if segue?.identifier == "resetGameSegue" {
let viewController = segue!.destinationViewController as! HelpScreenViewController
viewController.controller = self
}

但是,这不会导致任何结果发生。我的意思是主屏幕上的按钮可以正常工作(将用户带到帮助屏幕并且不会错误地调用resetGame函数)。而且,在帮助屏幕中,前两个按钮按预期工作,但“重置游戏”按钮只是将用户返回到第一个屏幕,但没有调用 ResetGame 函数。

我还尝试从我的代码和“重置游戏”按钮的连接检查器中删除 IBActions,但这也没有什么区别。

任何帮助将不胜感激,因为我只是没有得到它! :(

最佳答案

我同意 MikeG 的观点,你应该了解如何实现委托(delegate)。但是您在这段代码中做错的事情是您实际上并没有在委托(delegate)上调用 ResetGame() 函数。尝试以这种方式实现您的 @IBAction 函数:

@IBAction func buttonResetGame(sender: AnyObject) {
controller?.ResetGame()
}

是的,如果我正确理解你的逻辑,你的 HelpScreenViewController 不应该实现 MyResetGameProtocol 因为你的 ViewController 是实现它的人。

关于swift - 为什么我的prepareForSegue代码激活了错误的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35249807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com