以编程方式显示 ViewController(不工作)

Posted

技术标签:

【中文标题】以编程方式显示 ViewController(不工作)【英文标题】:Show ViewController programmatically (not working) 【发布时间】:2020-03-30 13:22:44 【问题描述】:

我有一个名为“ViewController.swift”的主 VC,它与 Main.storyboard 中的 ViewController 场景绑定。 然后我想要另一个屏幕,它显示我的 ViewController.swift 中的条件何时满足。 因此,我得到了一个 Gameover.storyboard,它有一个带有 Storyboard ID“overID”的 VC 场景以及一个用于处理 GameOver 场景的“GameoverViewController.swift”。

这是我在 ViewController.swift 中的代码,当满足以下条件时,它应该会打开 Gameover.storyboards VC 场景:

       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))

            
        

现在为您提供了一些屏幕截图,这可能会有所帮助。

如果您需要更多屏幕,请询问。

现在,我收到以下错误:

1) ViewController.swift 上部标有“!!!...”

不能在属性初始化器中使用实例成员“storyBoard”;属性初始化器在“self”可用之前运行

2) ViewController.swift

无法将“gameoverViewController.Type”类型的值转换为预期的参数类型“UIViewController”

3) ViewController.swift 上半部分:

使用未声明的类型“GameoverViewController”

这就是我更改代码的方式:

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】:

    gameoverViewController 的初始化器移动到viewDidLoad 或类似的位置,并使gameoverViewController 成为可选或隐式展开的可选(即类型后的!

    应该由 1 固定。

    如果这也没有被 1. 修复,请显示 GameoverViewController 的源代码。

【讨论】:

我将“let gameoverViewController = storyBoard.instantiateViewController(with identifier: "overID") as!GameoverViewController” 移到 viewDidLoad 中,但不幸的是,编译器对这一行说“使用未声明的类型 'GameoverViewController'”。 . 你到底要我在哪里加一个“!” ? @RacketCoder 如果将此变量的声明移到初始化器中,以后在updateTime 中将无法访问它。您必须将其保留为属性,但在viewDidLoad初始化它。如果您不了解这些术语,请阅读它们。正如我所说,那么请显示 GameoverViewController 的源代码。 我为 GameoverViewController 添加了资源(我希望如此)。而且还没有代码,除了 import UIKit class gameoverViewController: NSObject @RacketCoder 大小写在 Swift 中很重要。小写与大写 G。除此之外,您将无法将 NSObject 的子类用作视图控制器,即与 present 一起使用。视图控制器必须是 UIViewController 的子类。 我将更改添加到主要问题

以上是关于以编程方式显示 ViewController(不工作)的主要内容,如果未能解决你的问题,请参考以下文章

Swift:以编程方式编码时,搜索栏未显示在 viewController 上

以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容

Swift 5. 如何在按钮触摸时呈现或显示 ViewController?没有情节提要(以编程方式)

以编程方式加载新的 ViewController

以编程方式/自动创建 ViewController

今日图书—大巧不工/JavaScript异步编程/结网/创新者的窘境