Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用InstanceDeviceController WithiIdentifier访问相同的视图控制器_Ios_Swift_Uistoryboard - Fatal编程技术网

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