当前位置: 首页 > 面试题库 >

在Swift 3中创建ViewController的单例

邵骁
2023-03-14
问题内容

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

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 这个问题不是为了讨论是否需要单例设计模式,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式。在这种情况下,我定义“最pythonic”表示它遵循“最小惊讶原则”。 我有多个将成为单例的类(我的用例用于记录器,但这并不重要)。当我可以简单地继承或修饰时,我不希望增加gumph来使几个类杂乱无章。 最佳方法: 方法1:装饰器 优点

  • 问题内容: 我在应用程序中使用时遇到问题。 我正在应用程序的构造函数中创建。套接字的构造函数调用该方法以等待客户端连接。 问题在于该方法将冻结我的整个应用程序,直到客户端连接为止。因此,我想问一下是否有替代方法可以在单独的线程中创建整体,在我的主应用程序旁边调用的构造方法及其方法? 编辑: 感谢Olivier的建议,将.accept放入一个可运行的程序并创建一个线程池来处理客户端连接。 那就是我现

  • 为什么这在《雨燕3》中行不通?它会在运行时崩溃,并表示: “-[MY_APP_NAME.DisplayOtherappSCTRL TAP:]:无法识别的选择器已发送到实例0x17ECEB70”

  • 问题内容: 编辑已 解决 :如何在GoLang中创建单例DBManager类。 我参考了一些有关如何创建单例的代码示例,但是我希望在其中包含方法,并在其单例引用中对其进行调用。我的代码如下 通过新答案,我更新了此问题,包括答案。 但是我有一些疑问。如何从gorm.Create(..)进行Cathc并返回异常 问题答案: 一种方法是使用这些方法创建一个导出的接口,并使实现类型不导出。创建接口类型的全

  • 我正在快速有效地学习单例模式来创建单例类,并找到了如下创建的最佳方法。 因为我使用了语句,所以它是只读属性,必须是线程安全的,所以从目标C开始就不需要调度一次。用于将变量设置为变量。 但这如何保证在整个应用程序中只创建一个实例呢?有什么我错过的小东西吗?

  • 问题内容: 已在Swift3中弃用。任何人都可以提供一些示例来说明尝试打开URL时替换的工作方式吗? 问题答案: 所有你需要的是: