- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@“DoSomething”]) {
if ([segue.destinationViewController isKindOfClass:[DoSomethingVC class]]) {
DoSomethingVC *doVC = (DoSomethingVC *)segue.destinationViewController;
doVC.neededInfo = ...; }
}
}
在上面的代码中,我不明白为什么需要局部变量 doVC。
如果你的destinationViewController已经存在于堆中,为什么不能将数据传递给它
seque.destinationViewController.neededInfo =...
如果堆中不存在,难道不应该分配并初始化它吗?这就是这行代码的主要作用吗?
DoSomethingVC *doVC = (DoSomethingVC *)segue.destinationViewController;
您正在分配并实例化 DoSomethingVC 类的实例吗? 如果是这样,我不明白这个局部变量将如何保持事件状态,因为它是本地的。一旦序列完成,sourceVC 也会死亡。
我只是不明白编译器如何操作这个进程背后的内存并将数据从这个本地变量同步到destinationViewController。
最佳答案
segue.destinationViewController
是 UIViewController
类型(尽管它实际上是一个 DoSomethingVC
,其基类型为 UIViewController
),所以它不会知道您的变量 neededInfo
,这就是您需要将其转换为 DoDomethingVC
的原因。
它使 segue.destinationViewController
的类型 UIViewController
保持通用,因为它无法在编译时真正知道这个 destinationViewController
将要做什么是。
预感你对继承的把握有点不稳定(不是刻薄)但打个比方,如果 UIViewController
是说类型 Bird
并且DoSomethingVC
是 Duck
类型,此 prepareForSegue:
方法知道 Bird
将成为 destinationViewController,但它不是此时不知道它是一只鸭子
还是其他某种鸟,所以你必须明确地告诉它它会是什么(如果你弄错了它会做什么)坏事,或崩溃)框架也不知道有什么种类的鸟(因为你正在制造它们),所以它不能为你考虑
关于ios - 分配并初始化 destinationViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20870846/