-
从代码启动UIViewController时,它需要运行的数据会作为init方法中的参数传递,并保存在非可选属性中,因此,当调用
ViewDidLoad()
时,您可以对数据和视图执行所需的任何操作 -
当执行segue时,属性被声明为隐式展开选项(因为故事板需要没有额外参数的init方法来初始化它)。初始化之后,调用
loadView()
并设置出口。最后,调用prepareForSegue:sender:
,其中数据在前面声明的属性中传递和设置,因此,当调用ViewDidLoad()
时,您可以对数据和视图执行任何需要的操作 -
使用
UIStoryboard.instantiateViewController
时如何传递数据?据我所知,情节提要会自动调用loadView()
,以viewDidLoad()
结尾,而不会让您有机会将数据传递到您声明的自定义属性,因此此时数据还没有准备好使用
(很明显,我可以在调用UIStoryboard.instantiateViewController
之后设置属性,但我认为此过程不保证在调用viewDidLoad()
之前设置它们)
例如,这(很可能)会起作用:
- 呼叫
UIStoryboard.instantiateViewController
- 在目标UIViewController中设置自定义属性的值
- 调用
viewDidLoad()
,在里面我可以使用数据和视图对象。(因为我在之前为那些属性赋值)
但是想象一下如果:
- 呼叫
UIStoryboard.instantiateViewController
。。。我花了一些时间为自定义属性赋予价值 - 调用
viewDidLoad()
,在内部我使用自定义属性。应用程序很可能会崩溃,因为未设置这些属性的值 - 在目标UIViewController中设置自定义属性的值(此处已执行
viewDidLoad()
)
viewDidLoad()
确实用于对视图进行额外初始化,因为当您初始化视图控制器(使用-init或-initWithNibName:bundle:)时,它实际上并没有创建和初始化视图。当您第一次调用-view时,它会调用-loadView(我想这就是为什么viewDidLoad()
是必要的,用于额外的初始化)。然而,UIViewController本身就是一个类,我认为设置类Object的属性没有任何错误。
我还看了UIStoryboard.instantiateViewController
:的定义
使用此方法创建要在应用程序中以编程方式操作和呈现。之前可以使用此方法检索视图控制器,必须在接口中使用适当的标识符字符串显式标记它建设者
此方法创建指定视图控制器的新实例每次你叫它。
我强调new instance
,因为它与创建新的viewController不同。通过使用UIStoryboard.instantiateViewController
,您在情节提要中创建的所有视图都将自动为您实例化,并且所有出口和操作都将按照您在情节摘要中指定的方式设置。
正如Apple Doc所说的"在你的应用程序中以编程方式操作和呈现",我认为你可以随意这样做