我正在制作具有2个UIViewController的简单故事板应用程序,我正在使用模态segue在它们之间切换。每个UIViewController都有一个UIButton,用于执行到另一个UIViewController的segue。在viewddLoad方法中,我在每个UIViewController上对该UIButton的外观进行动画处理。我使用交叉溶解模态segue。
当我按下第一个UIViewController上的UIButton时,我导航到第二个UIViewController,并执行动画,显示第二个UIViewController。在我按下第二个UIView控制器上的UIButton后,将显示第一个UIViewController,并执行其动画。一切看起来都很好,每次导航到UIViewController时,都会为其调用viewDidLoad方法。这太棒了。
我现在尝试将模态segue类型从交叉融合更改为XCode Interface Builder中默认提供的其他两种。我改为垂直覆盖,一切都很好,没有变化。但当我尝试翻转水平模态序列时,我发现了一个问题。
执行翻转水平模式分段时,将显示两个UIViewController上的“我的UIButton”,但不会执行动画。我尝试过调试,我确信动画命令正在执行,但动画没有显示。
所以这是我的第一个问题:有人知道这些模态序列之间有什么区别吗?这可能会导致我的动画没有显示出来?
其他问题与segue和内存管理的基本理论有关。当我执行segue并导航到某个UIViewController时,每次都会调用viewddLoad方法。那么,这是否意味着每次执行viewddLoad方法时我都会创建新的对象实例?
我还注意到,从未调用viewDidUnload方法。所以,如果前面问题的答案是肯定的(每个viewDidLoad执行都会创建新的对象实例),这是否意味着我的UIViewController对象实例永远不会被卸载和删除?还是ARC在幕后进行垃圾收集?
如果有人能解释故事板分段和内存管理/对象生命周期是如何工作的,以及为什么从来没有调用viewDidUnload方法,我将非常感激。
[编辑#1:在执行模式segue后尝试卸载UIViewController]
[更新#1:这不应该这样做,viewddUnload将被自动调用]
我正在制作附加到UIButton点击的IBAction中的segue。我编写了这段代码来执行模态segue。
@try
{
[self performSegueWithIdentifier:segueToPerform sender:self];
}
@catch (NSException *exception)
{
NSLog(@"Exception: %@", exception);
}
@finally
{
[self viewDidUnload];
}
我已经手动调用了viewddUnload在@最终块,我已经检查了天气viewddUnload是在运行时调用,是的-它被调用。
这是否意味着我成功地从另一个UIViewController卸载了使用模式segue导航到它时创建的UIViewController对象,并将其从内存中删除?
此方法是否常规替代:
[self dismissViewControllerAnimated:YES completion:nil];
因为上面这一行将我返回到导航到当前UIViewController的UIViewController,但这不符合我的需要,因为我需要执行从当前UIViewController到其他UIViewController的新分段(除了返回到导航到当前UIViewController的UIViewController之外)?
[编辑#2:完成]
最后,在为这些UIView创建单独的XIB文件后,我更改了实现模型,并在单个UIViewController下加载了新的UIView。我已经将@dasblinkenlight的答案标记为正确的答案,因为它包含了许多有用的信息,对该答案的讨论很好地回答了一些关于使用模态segues的疑问。
我遇到了一个类似的问题,我有一个复杂的VC导航Web,结果使用segue(没有UINavigationController)占用了太多内存。您可能想看看这个问题/答案,看看我的最终解决方案。uerceg和dasblinkenlight之间的对话帮助我找到了这个解决方案。
从内存中分段并清除历史ViewController
我不知道你问题第一部分的答案,但一旦你知道了第二部分的答案,我相信你无论如何都会采取不同的解决方案。
每次都会调用viewDidLoad方法。所以,这是否意味着每次执行方法时,我都会创建新的对象实例?
绝对地“模态”segue使新视图完全遮挡旧视图,直到新视图关闭。如果来回多次,您的代码将在当前视图下累积一个完整的视图“堆栈”。
我还注意到,从未调用viewDidUnload方法。所以,如果前面问题的答案是肯定的(每个执行都会创建新的对象实例),这是否意味着我的UIViewController对象实例永远不会被卸载和删除?
这是正确的,您创建的所有视图控制器仍然存在,可以关闭其顶部的视图。
还是ARC在幕后做垃圾回收机制?
ARC不是垃圾收集器,它是一种引用计数机制,带有编译器的一点自动化。对象仍然存在。
您应该更改代码以调用
[self dismissModalViewControllerAnimated:YES];
在第二个控制器中,而不是使用将您带回第一个控制器的html" target="_blank">模式序列。
本文向大家介绍IOS 中loadView,viewDidLoad,viewDidUnload详解及使用,包括了IOS 中loadView,viewDidLoad,viewDidUnload详解及使用的使用技巧和注意事项,需要的朋友参考一下 loadView,viewDidLoad,viewDidUnload,这三个函数到底应该怎么用? 搜索一下,全是转载,大概内容是这样: loadView 手动加
问题内容: 如果应用程序是第一次加载,我正在尝试执行segue。我可以在调试器中看到我的打印消息,但是Perform Segue无法正常工作。我没有任何错误。有人可以告诉我怎么了吗? 问题答案: 您不能在viewDidLoad()中使用performSegue()。将其移动到viewDidAppear()。 在viewDidLoad()时,当前视图甚至还没有附加到窗口,因此尚无法进行隔离。
我正在遵循本教程 到目前为止,当我点击按钮时,它就可以工作了。然而,我似乎无法让它在viewDidLoad上显示中间广告。 这就是我所拥有的: 控制台不断向我显示: 2016-02-04 22:27:51.855 GoogleAdamObjutorial[3394:56415]要获取此设备上的测试广告,请致电:request。testDevices=@[kGADSimulatorID]; 单击按钮
在应用程序启动时,我试图使用以下代码通过查看加载更改单独视图的位置: 但是,这似乎无法直接在viewDidLoad中工作。如果我使用iAction将to指定给按钮,代码就会工作 我猜我这里遗漏了什么,但我不知道是什么。
本文向大家介绍ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?相关面试题,主要包含被问及ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?在自定义ViewCont
当完成时,我有一个segue被5种不同的方法调用。我发现,如果我只调用一次segue(仅为一个设置动画),一切都可以正常工作,但通过调用多个,会出现以下错误: 完成块(所有动画相同) 因此,当所有五个动画都完成(并满足条件)时,它会调用segue 5次并创建错误(我非常确定,因为我做了很多测试) 我想要的是,当动画(并满足条件)完成时,可以毫无错误地过渡到。有什么帮助吗?