我知道如何快速创建单例类。创建单例类的最佳简便方法如下:
class Singleton { static let sharedInstance = Singleton() }
但是我不需要任何普通班的单身人士。我需要为viewcontroller类创建单例。所以我用这段代码创建单例
class AViewController:UIViewController { static let sharedInstance = AViewController() required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } }
它给我附近的错误 AViewController()
AViewController()
Missing argument for parameter 'coder' in call
似乎要我使用进行初始化init(coder: NSCoder)。但是我应该通过什么参数或值coder?
init(coder: NSCoder)
coder
如果您真的想为某个场景对应的视图控制器设置单例,则可能需要执行以下操作:
class SecondViewController: UIViewController { static let shared = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Foo") }
在此示例中,情节提要是Main.storyboard,问题场景的情节提要标识符是Foo。显然,将这些值替换为适合您的情况的值。
Main.storyboard
Foo
然后您的另一个调用此方法的视图控制器可以执行以下操作:
@IBAction func didTapButton(_ sender: Any) { let controller = SecondViewController.shared show(controller, sender: self) }
我不建议将单例用于视图控制器。视图控制器(及其视图)应在需要时创建,并在解散它们时允许释放。而且您将失去许多情节提要优势(通过它们您可以看到场景之间的逻辑流程以及场景之间的顺序)。而且,如果您在不同的上下文中使用此视图控制器,则会引发由视图控制器层次结构与视图层次结构不同步引起的问题。我真的不鼓励您使用单例作为视图控制器。
但是,如果您打算这样做,则可以执行类似的操作…