Как попросить инициалы для игры в Swift - PullRequest
0 голосов
/ 27 декабря 2018

Я делаю игру в Swift, которая записывает высокий счет и инициалы (по аналогии с записями пинбола) и отображает их на экране игры в виде меток.Я использую код ниже, чтобы записать высокий балл и инициалы на моем телефоне и обновить их.Пока эта программа будет только на моем телефоне, поэтому я не беспокоюсь о сохранении или обновлении данных в удаленной базе данных.

То, что я пока не знаю, как это сделать, - это сделать немноговсплывающее окно с просьбой ввести свои инициалы на клавиатуре при нажатии кнопки выхода, если они имеют текущий высокий балл.В идеале я хочу, чтобы он мог принимать только 3 символа и немедленно обновлять метку инициалов, прежде чем пользователь перейдет на другой контроллер представления.

@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var highScoreLabel: UILabel!
@IBOutlet weak var highScoreInitialsLabel: UILabel!
var score : Int = 0

//Stores and sets high score initials
var oldHighScoreInitials : String = "AAA"
var highScoreInitials : String {
    get {
        return UserDefaults.standard.string(forKey: "highScoreInitials") ?? "AAA"
    }
    set {
        UserDefaults.standard.set(newValue, forKey: "highScoreInitials")
    }
}


//Stores and sets high score
var oldHighScore : Int = 0
var highScore : Int {
    get {
        return UserDefaults.standard.integer(forKey: "highScore")
    }
    set {
        UserDefaults.standard.set(newValue, forKey: "highScore")
    }
}


override func viewDidLoad() {
    super.viewDidLoad()
    //Updates high score and initials labels with stored highest score and associated initials
    highScoreLabel.text = String(highScore)
    highScoreInitialsLabel.text = String(highScoreInitials)
    oldHighScore = highScore
    oldHighScoreInitials = highScoreInitials
}


//Asks for initials if new high score, and segues to Main VC
@IBAction func quitButtonPressed(_ sender: AnyObject) {
    if (score > highScore){
        highScore = score
        print("Ask for initials")
        print("Game over, thanks for playing!"
        print("Segue to Main VC")
    }

    else {
        print("Game over, thanks for playing!")
        print("Segue to Main VC")
    }
}

Большое спасибо всем, кто предлагает помощьили совет.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

После работы с Арье Пинто мы определили, что моя работа по предотвращению работы оповещения была связана с сообщением об ошибке, в которой говорилось, что моя программа пытается представить оповещение, представление которого отсутствует в иерархии окон.

Я запрограммировал свою работу с помощью ctrl +, перетащив кнопку выхода на другой контроллер представления без написания какого-либо кода.

Мое решение этого заключается в том, чтобы написать код executeSegue в функции quitButtonPressed, чтобы разрешить предупреждение и начальное обновлениекод для выполнения своих действий перед сменой окон.

0 голосов
/ 27 декабря 2018

Вот, пожалуйста, довольно просто, используя UIAlertViewController:

//Asks for initials if new high score, and segues to Main VC
@IBAction func quitButtonPressed(_ sender: AnyObject) {
    if (score > highScore){
        highScore = score

        let alert = UIAlertController(title: "NEW HIGH SCORE", message: "Please enter your initials", preferredStyle: .alert)

        alert.addTextField(configurationHandler: configurationTextField)

        alert.addAction(UIAlertAction(title: "DONE", style: .default, handler:{ (action) in

        //First example of updating initials
        guard alert.textFields![0].text?.characters.count != 0 else{
            return
        }

        self.oldHighScore = self.highScore
        self.oldHighScoreInitials = alert.textFields![0].text

        //Segue to Main VC
        }))

        present(alert, animated: true, completion: nil)
    }

    else {
        print("Game over, thanks for playing!")
        print("Segue to Main VC")
    }
}

func configurationTextField(textField: UITextField!){
    textField.delegate = self
    textField.textAlignment = .center
    textField.placeholder = "_ _ _"
}

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let count = text.count + string.count - range.length
    return count <= 3
}

//Second example of updating initials
func textFieldDidEndEditing(_ textField: UITextField) {
    oldHighScore = highScore
    oldHighScoreInitials = textField.text
}

И, наконец, ваш контроллер должен соответствовать протоколу UITextFieldDelegate:

class yourController: UIViewController, UITextFieldDelegate
...