Показать ViewController программно (не работает) - PullRequest
0 голосов
/ 30 марта 2020

Я получил основной V C под названием "ViewController.swift", который связан с моей сценой ViewController в Main.storyboard. Затем я хочу другой экран, который показывает, когда выполняется условие в моем ViewController.swift. Поэтому я получил Gameover.storyboard, который имеет сцену V C с идентификатором Storyboard "overID", а также "GameoverViewController.swift" для обработки сцены GameOver.

Вот мой код в ViewController.swift, который должен открыть Gameover.storyboards V C Сцена, когда выполнено условие, которое вы видите ниже:

       import UIKit

        class ViewController: UIViewController {
            var wantedLiter = 10.00
            var timer : Timer?
            var actualLiter = 0.00
            var timerReset = true
            var preisProLiter = 1.26


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


            let storyBoard: UIStoryboard = UIStoryboard(name: "Gameover", bundle: nil)

            let gameoverViewController = storyBoard.instantiateViewController(withIdentifier: "overID") as! GameoverViewController 

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            @IBOutlet weak var preisliterLabel: UILabel!
            @IBOutlet weak var euroLabel: UILabel!
            @IBOutlet weak var numberLabel: UILabel!
            @IBOutlet weak var numberButton: UIButton!
            @IBOutlet weak var confirmButton: UIButton!


            @IBAction func confirm(_ sender: Any) {

            }

            override func viewDidLoad() {
                super.viewDidLoad()
                numberLabel.text = String(round(1000*actualLiter)/1000) //initial value
                preisliterLabel.text = String(preisProLiter)
                // Do any additional setup after loading the view.
            }

            @IBAction func holdingTheButton(_ sender: Any) {
                print("I am holding")
                       timerReset = false // reset to false since you are holding the button
                       guard timer == nil else { return }
                       timer = Timer.scheduledTimer(timeInterval: 0.005, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
            }


            @IBAction func buttonReleased(_ sender: Any) {
                print("button released")
                if (wantedLiter == actualLiter){
                    print("WIN!")
                    actualLiter = 0;
                }
               //startTime = 0.00
                 timer?.invalidate()
                 timer = nil
               // timerReset = true // reset to true since you released.
            }


            @objc func updateTime(){
                //update label every second

                print("updating label ")
                if (wantedLiter <= actualLiter){
                    print("Ooops")
                    actualLiter = 0; 

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


self.present(gameoverViewController, animated: true, completion: nil) 

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                }

               actualLiter += 0.01
               numberLabel.text = String(round(1000*actualLiter)/1000)
               euroLabel.text = String((round(100*actualLiter*preisProLiter)/100))

            }
        }

А теперь у вас есть несколько скриншотов , что может помочь.

Overview

Main ViewController Scene

Gameover SCENE (can't choose GameoverViewController as Class here)

Если вам нужно больше экранов, пожалуйста, спросите.

Прямо сейчас , Я получил следующие ошибки:

1) ViewController.swift в верхней части, помеченный как "!!!! ..."

Невозможно использовать элемент экземпляра storyBoard в инициализаторе свойства; инициализаторы свойств запускаются до того, как станет доступным 'self'

2) ViewController.swift

Невозможно преобразовать значение типа 'gameoverViewController.Type' в ожидаемый тип аргумента 'UIViewController'

3 ) ViewController.swift верхняя часть:

Использование необъявленного типа 'GameoverViewController'

Source of GameoverViewController I hope..

Вот как я изменил код:

import UIKit

class ViewController: UIViewController {
    var wantedLiter = 10.00
    var timer : Timer?
    var actualLiter = 0.00
    var timerReset = true
    var preisProLiter = 1.26


   let storyBoard: UIStoryboard = UIStoryboard(name: "Gameover", bundle: nil)
    var gameoverViewController: GameoverViewController!

    @IBOutlet weak var preisliterLabel: UILabel!
    @IBOutlet weak var euroLabel: UILabel!
    @IBOutlet weak var numberLabel: UILabel!
    @IBOutlet weak var numberButton: UIButton!
    @IBOutlet weak var confirmButton: UIButton!


    @IBAction func confirm(_ sender: Any) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        gameoverViewController = storyBoard.instantiateViewController(withIdentifier: "overID") as? GameoverViewController

        numberLabel.text = String(round(1000*actualLiter)/1000) //initial value
        preisliterLabel.text = String(preisProLiter)
        // Do any additional setup after loading the view.
    }

    @IBAction func holdingTheButton(_ sender: Any) {
        print("I am holding")
               timerReset = false // reset to false since you are holding the button
               guard timer == nil else { return }
               timer = Timer.scheduledTimer(timeInterval: 0.005, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    }


    @IBAction func buttonReleased(_ sender: Any) {
        print("button released")
        if (wantedLiter == actualLiter){
            print("WIN!")
            actualLiter = 0;
        }
       //startTime = 0.00
         timer?.invalidate()
         timer = nil
       // timerReset = true // reset to true since you released.
    }


    @objc func updateTime(){
        //update label every second

        print("updating label ")
        if (wantedLiter <= actualLiter){
            print("Ooops")
            actualLiter = 0;
            self.present(gameoverViewController as! UIViewController, animated: true, completion: nil)
        }

       actualLiter += 0.01
       numberLabel.text = String(round(1000*actualLiter)/1000)
       euroLabel.text = String((round(100*actualLiter*preisProLiter)/100))

    }
}

(не работает)

И я изменил тип GameoverViewController на UIViewController.

Но где была моя опечатка ?? (G вместо g)?

1 Ответ

0 голосов
/ 30 марта 2020
  1. Переместите инициализатор для gameoverViewController в viewDidLoad или тому подобное и сделайте gameoverViewController необязательным или неявно развернутым необязательным (это ! после типа)

  2. Должно быть исправлено на 1.

  3. Пожалуйста, покажите исходный код для GameoverViewController, если это тоже не исправлено 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...