在swift中创build一个viewcontroller的单例

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

class Singleton { static let sharedInstance = Singleton() } 

但是我不需要任何一个普通class级的单身人士。 我需要为viewcontroller类创build单例。 所以我使用这个代码创build单身人士

 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通过什么参数或值?

如果你真的想要一个视图控制器对应一些场景的单身人士,你可能会做这样的事情:

 class SecondViewController: UIViewController { static let shared = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Foo") } 

在这个例子中,故事板是Main.storyboard ,故事板的故事板标识符是Foo 。 显然,在你的情况下,将这些值replace为合适的值。

然后你调用它的其他视图控制器可以做这样的事情:

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

我不会build议视图控制器的单身人士。 视图控制器(及其视图)应该在需要时创build,并在被解雇时被允许被释放。 而且你正在失去许多故事板的好处(通过它你可以看到它们之间有连贯的场景之间的逻辑stream程)。 而且,如果在不同的上下文中使用这个视图控制器,则会引起视图控制器层次结构与视图层次结构不同步的问题。 我真的会阻止你使用视图控制器的单身人士。

但是如果你要这样做,你可以做这样的事情…

试着做:

AppDelegate中:

添加一个对ViewController的引用,所以你可以全局访问它,就像这样:

 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? private var viewController: ViewController? func getViewController() -> ViewController { if viewController == nil { // make sure that the name of the storyboard is "Main" let storyboard = UIStoryboard(name: "Main", bundle: nil) // make sure that you named the viewcontroller in storyboard (Storyboard ID), it is the identifier viewController = storyboard.instantiateViewController(withIdentifier: "ViewControllerStoryboardID") as! ViewController } return viewController! } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } // .... } 

AnotherViewController(用法):

现在你可以通过“AppDelegate”来访问它,如下所示:

 class AnotherViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let appDelegate = UIApplication.shared.delegate as! AppDelegate let vc = appDelegate.getViewController() } // ... } 

希望这有助于。