一尘不染

在Swift 3中创建ViewController的单例

swift

我知道如何快速创建单例类。创建单例类的最佳简便方法如下:

class Singleton {
    static let sharedInstance = Singleton()
}

但是我不需要任何普通班的单身人士。我需要为viewcontroller类创建单例。所以我用这段代码创建单例

class AViewController:UIViewController {

    static let sharedInstance = AViewController()

    required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

}

它给我附近的错误 AViewController()

Missing argument for parameter 'coder' in call

似乎要我使用进行初始化init(coder: NSCoder)。但是我应该通过什么参数或值coder


阅读 619

收藏
2020-07-07

共1个答案

一尘不染

如果您真的想为某个场景对应的视图控制器设置单例,则可能需要执行以下操作:

class SecondViewController: UIViewController {

    static let shared = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Foo")

}

在此示例中,情节提要是Main.storyboard,问题场景的情节提要标识符是Foo。显然,将这​​些值替换为适合您的情况的值。

然后您的另一个调用此方法的视图控制器可以执行以下操作:

@IBAction func didTapButton(_ sender: Any) {
    let controller = SecondViewController.shared
    show(controller, sender: self)
}

我不建议将单例用于视图控制器。视图控制器(及其视图)应在需要时创建,并在解散它们时允许释放。而且您将失去许多情节提要优势(通过它们您可以看到场景之间的逻辑流程以及场景之间的顺序)。而且,如果您在不同的上下文中使用此视图控制器,则会引发由视图控制器层次结构与视图层次结构不同步引起的问题。我真的不鼓励您使用单例作为视图控制器。

但是,如果您打算这样做,则可以执行类似的操作…

2020-07-07