我知道如何在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
?
答案 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)