如何正确地初始化()一个快速视图控制器?

Posted

技术标签:

【中文标题】如何正确地初始化()一个快速视图控制器?【英文标题】:how to init() a swift view controller properly? 【发布时间】:2019-03-28 21:53:35 【问题描述】:

我正在尝试初始化这个 ViewController 类。我没有使用 MVC 设计策略,所以忽略使用的不良约定(如果有的话)。

如何正确初始化这个类?

错误:“必需”初始化程序“init(coder:)”必须由“UIViewController”的子类提供

上下文:这是一个计算器应用程序,当按下任何按钮时。它将查找发件人的标题,如果三个变量之一为 nil,它将存储在该选项中。

import UIKit

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    

    @IBOutlet weak var answerLabel: UILabel!
    //global vars for all funcs
    var selection1: Int? 
        didSet  answerLabel.text = String(selection1!) 
    
    var selection2: String? 
        didSet  answerLabel.text = selection2! 
    
    var selection3: Int? 
        didSet  answerLabel.text = String(selection3!) 
    

    var answer: Int 
        didSet  answerLabel.text = String(answer) 
    


    init() 


    



    @IBAction func touchButton(_ sender: UIButton) 
        if selection1 == nil 
            selection1 = Int(sender.currentTitle!)
            print("Selection set in first pos.")
         else if selection2 == nil 
            selection2 = sender.currentTitle
         else if selection3 == nil 
            selection3 = Int(sender.currentTitle!)
         else 
            calculate(firstNum: selection1!, operation: selection2!, secondNum: selection3!)
        
    

    func calculate(firstNum: Int, operation: String, secondNum: Int) 
        switch operation 
        case "+":
            answer = firstNum + secondNum
        case "-":
            answer = firstNum - secondNum
        case "x":
            answer = firstNum * secondNum
        case "/":
            answer = firstNum / secondNum
        default:
            answerLabel.text = "Something went wrong!"
        
    



【问题讨论】:

因为我使用的选项可能不包含值,所以我需要以某种方式初始化类 重复 -- ***.com/questions/30679129/… 您可以通过为您的属性设置默认值来避免创建初始化。例如 var answer: Int = 0 ... 【参考方案1】:

初始化取决于几个条件。

    如果您使用故事板,您只需删除init,您的 VC 将拥有默认初始化程序。确保所有属性都具有默认值或者它们是可选的。 如果您使用xib 或只是以编程方式创建视图,您可以使用自定义便利初始化程序,通过这种方式传递一些额外的数据。
class MyViewController: ViewController 
   var answer: Int
   convenience init(answer: Int) 
       self.init()

       self.answer = answer
       // Do other setup
   

【讨论】:

【参考方案2】:

您的控制器正在从情节提要中实例化。配置初始视图的安全位置是在控制器调用viewDidLoad 期间,即:

override func viewDidLoad() 
    super.viewDidLoad()
    // configure your views and subviews here

【讨论】:

以上是关于如何正确地初始化()一个快速视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确初始化共享视图?

如何正确管理每个视图控制器中的 NSManagedObjectContext?

应用程序关闭后如何快速保存全局变量?

快速更改 AppDelegate 中的初始视图控制器

如何在解除其顶部的视图控制器后处理初始视图控制器

Swift:如果没有导航控制器,如何返回初始视图控制器