Ios 使用InstanceDeviceController WithiIdentifier访问相同的视图控制器
我在故事板中有一个Ios 使用InstanceDeviceController WithiIdentifier访问相同的视图控制器,ios,swift,uistoryboard,Ios,Swift,Uistoryboard,我在故事板中有一个UIViewController,故事板id为“MyViewController”(嵌入UINavigationController作为入口点), 我试着从另一个类中使用instanceeviewcontrollerwhiteIdentifier访问它,比如: MyAccessor.swift func accessMyViewController(){ let storyboard = UIStoryboard(name: "Main", bundle: NSBundle
UIViewController
,故事板id为“MyViewController”(嵌入UINavigationController
作为入口点),
我试着从另一个类中使用instanceeviewcontrollerwhiteIdentifier
访问它,比如:
MyAccessor.swift
func accessMyViewController(){
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
print(vc.description)
}
override func viewDidLoad() {
print(self.description)
}
func accessMyViewController(){
...
print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ")
}
override func viewDidLoad() {
...
print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ")
}
MyViewController.swift
func accessMyViewController(){
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
print(vc.description)
}
override func viewDidLoad() {
print(self.description)
}
func accessMyViewController(){
...
print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ")
}
override func viewDidLoad() {
...
print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ")
}
控制台
<MyViewController: 0x7ff6ab76f9c0>
<MyViewController: 0x7ff6ab557410>
我打印了不同的内存地址
它们不是应该是同一个吗?如此方法的中所述,它将始终创建一个新实例:
每次调用指定的视图控制器时,此方法都会创建该视图控制器的新实例
如果需要视图控制器的同一实例,则需要将引用存储在其他位置(例如,创建第一个实例的视图控制器)
第一个实例MyViewController
可能是由故事板本身创建的,因为它是初始视图控制器
更新:
在再次查看代码和问题之后,我现在知道到底发生了什么。
如上所述,导航控制器是故事板的入口点。这意味着MyViewController
的第一个实例是由序列图像板创建的,这将导致viewDidLoad
方法中的第一次打印。
第二个实例由MyAccessor.swift中的代码创建。同一文件内的打印将导致第二个输出行。但是,从未加载第二个实例的视图,这会导致从未调用viewDidLoad
。如果您在vc
上调用loadViewIfNeeded
,将导致第三个输出行,该行将打印与MyAccessor.swift中的print
相同的内存地址。如此方法的中所述,它将始终创建一个新实例:
每次调用指定的视图控制器时,此方法都会创建该视图控制器的新实例
如果需要视图控制器的同一实例,则需要将引用存储在其他位置(例如,创建第一个实例的视图控制器)
第一个实例MyViewController
可能是由故事板本身创建的,因为它是初始视图控制器
更新:
在再次查看代码和问题之后,我现在知道到底发生了什么。
如上所述,导航控制器是故事板的入口点。这意味着MyViewController
的第一个实例是由序列图像板创建的,这将导致viewDidLoad
方法中的第一次打印。
第二个实例由MyAccessor.swift中的代码创建。同一文件内的打印将导致第二个输出行。但是,从未加载第二个实例的视图,这会导致从未调用
viewDidLoad
。如果您在vc
上调用loadViewIfNeeded
,将导致第三个输出行,它将打印与MyAccessor.swift内的print
相同的内存地址。可能您的导航控制器是故事板入口点
因此,如果这是真的,则有两个实例..一个是在应用程序启动期间创建的,另一个是从代码中以编程方式调用的
注意:viewDidLoad不会仅通过实例化视图控制器来调用,有关详细信息,请参阅..,否则您将看到三个打印
如果您想立即看到您的情况,请尝试修改打印行:
MyAccessor.swift
func accessMyViewController(){
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
print(vc.description)
}
override func viewDidLoad() {
print(self.description)
}
func accessMyViewController(){
...
print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ")
}
override func viewDidLoad() {
...
print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ")
}
MyViewController.swift
func accessMyViewController(){
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
print(vc.description)
}
override func viewDidLoad() {
print(self.description)
}
func accessMyViewController(){
...
print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ")
}
override func viewDidLoad() {
...
print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ")
}
您的navigationController可能是故事板入口点 因此,如果这是真的,则有两个实例..一个是在应用程序启动期间创建的,另一个是从代码中以编程方式调用的 注意:viewDidLoad不会仅通过实例化视图控制器来调用,有关详细信息,请参阅..,否则您将看到三个打印 如果您想立即看到您的情况,请尝试修改打印行: MyAccessor.swift
func accessMyViewController(){
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
print(vc.description)
}
override func viewDidLoad() {
print(self.description)
}
func accessMyViewController(){
...
print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ")
}
override func viewDidLoad() {
...
print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ")
}
MyViewController.swift
func accessMyViewController(){
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController")
print(vc.description)
}
override func viewDidLoad() {
print(self.description)
}
func accessMyViewController(){
...
print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ")
}
override func viewDidLoad() {
...
print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ")
}
您只是实例化vc,而不是显示it@MidhunMP它被显示,因为它嵌入了一个导航控制器中,该控制器被设置为初始视图控制器。当您使用InstanceViewController标识符时,它会分配新实例。在这个例子中有两个实例,一个是显示的(初始视图控制器),另一个是您使用代码分配的,您只是在实例化vc,不显示it@MidhunMP它被显示,因为它嵌入了一个导航控制器中,该控制器被设置为初始视图控制器。当您使用InstanceViewController标识符时,它会分配新实例。本例中有两个实例,一个显示(初始视图控制器),第二个是您使用代码分配的。据我从问题中了解,作者实例化了一个视图控制器。原始问题中的控制台部分列出了MyViewController的两个实例。但是
print
语句实际上会打印导航控制器(从MyAccessor.swift中)和视图控制器(从MyViewController.swift中)。是的,这就是问题的原因:他实例化了1个VC,但它会打印不同的地址。同样,在显示的代码中,这是不可能的。视图控制器最终实例化两次。也许第一次是因为它是故事板的入口点。是的,我刚刚又读了一遍这个问题,你是对的。作者只是实例化了两个不同的视图控制器。据我从问题中了解,作者实例化了一个视图控制器。原始问题中的控制台部分列出了两个inst