在swift 3中创建一个viewcontroller的单例

时间:2016-12-14 07:00:01

标签: ios swift singleton 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

传递什么参数或值

3 个答案:

答案 0 :(得分:10)

如果你真的想为某个场景对应的视图控制器设置单例,你可能会做类似的事情:

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

我不建议为视图控制器提供单例。应在需要时创建视图控制器(及其视图),并在被解除时允许取消分配。而且你正在失去许多故事板的好处(通过它你可以看到场景之间的逻辑流与它们之间的分段)。而且,如果在不同的上下文中使用此视图控制器,则会引发视图控制器层次结构与视图层次结构不同步的问题。我真的不鼓励你为视图控制器使用单例。

但如果你打算这样做,你可以做那样的事情......

答案 1 :(得分:2)

尝试:

<强>的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(用法):

现在您可以通过&#34; AppDelegate&#34;来访问它,如下所示:

class AnotherViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        let appDelegate = UIApplication.shared.delegate as! AppDelegate

        let vc = appDelegate.getViewController()
    }

    // ...
}

希望这会有所帮助。

答案 2 :(得分:0)

我会推荐以下内容:

enter image description here