Tag: uiviewcontroller

调用loadView明确 – 好/坏?

显式调用loadView有没有什么坏处? 我必须点击服务器并获取要显示的数据,并根据此视图上的某些用户操作更改此数据。 我正在我的loadView方法中的服务器调用,并传递适当的参数。 现在,当用户条件发生变化时,我调用[self loadView]修改参数。 你在这里看到一些问题吗?

Xcode:Storyboard并保留每个控制器中的数据

正如你可以猜到我是一个新的程序员,我有麻烦得到一个简单的事情! 我正在使用多个视图控制器的应用程序。 每个控制器都有文本字段和UIsegmentedControl项目。 当我从一个视图控制器移动到另一个视图控制器(如果重要的话,模式拖曳),前一个(文本框条目和分段控制选项)的内容将重置为其原始状态。 我怎样才能让他们保持以前的状态? 提前致谢。

当视图控制器被解散时,是否应清空内存?

我想了解Objective-C中的内存pipe理,我觉得这不是那么容易,因为我在Objective-C和ARC方面相当新颖,而且我大多用来编写我不需要处理的语言内存pipe理很多(或根本不)。 我正在处理的应用程序是按下button后,代码呈现viewController(附带xib文件)。 在这个视图控制器中,我有几个实例化的视图; 我logging了一系列图像(照片的相机,保存到磁盘),我转换成电影,我有一个GPS屏幕上的一个小地图的GPS跟踪器(mapKit)。 毕竟,我可以推一个“完成”button,调用[self dismissViewControllerAnimated:YES completion:nil]; viewController被animation回到我的rootViewController,因为我把一个NSLog消息放在viewController中的dealloc方法里,这个方法被解散了,我可以确认这个viewController被释放了。 问题是,我看到使用该应用程序后的记忆上升(用法包括在MapKit地图上拍摄照片和loggingGPS位置,以及生成一个电影文件)约80 MB,当我按下时,这将下降到约70MB '完成',所以viewController解散,应用程序返回到我的rootViewController。 我可以再次展示相同的viewController,使用它并closures它,应用程序仍然会占用大约70MB的内存,不会掉落。 这看起来不像是一个内存泄漏,因为在那种情况下,我希望每一个实例化和解除viewController的内存稳步增长。 即使我在我的rootViewController中有不同的button,但并不是这种情况,它们都实例化了我的viewController类的一个新的唯一实例。 我想知道:有什么我应该找的或是这种预期的行为? 也许应用程序caching类以备将来使用? 随着内存pipe理的完成,我应该期待一个应用程序恢复到“处女”的内存状态(在这种情况下,这将是4 MB左右)解除唯一的viewController提交?

如何消除一堆模态视图控制器与animation,而不会在屏幕上闪烁任何提交的VC之间的顶部和底部?

更新:通过下面的“截图”方法大纲修复。 这工作,但有没有更优雅的方式? 我将如何解决一堆模式视图控制器与animation,而不会在屏幕上闪烁任何提交的VC之间的顶部和底部? 试图用animation做到这一点是行不通的。 请参阅下面的代码和内嵌评论,描述我的问题。 您可以将这段代码复制/粘贴到Xcode中的一个新项目中,以便自己查看! // // ViewController.m // MultipleModals // #import "ViewController.h" #import "MyViewController.h" #import "MyHelper.h" @interface ViewController () @end @implementation ViewController static BOOL doAgain = YES; // So when red appears again, we don't endlessly cycle (for testing) – (void)viewDidAppear:(BOOL)animated { // Invoke super [super viewDidAppear:animated]; // Prevent loop when we dismiss […]

如何在自定义容器视图控制器中实现交互式转换

我实现了自己的自定义容器视图控制器,并试图使其与iOS 7视图控制器转换兼容。 我让我的自定义容器视图控制器符合UIViewControllerContextTransitioning和我发送self当我呼吁transitionDuration:和animateTransition: 只要我只使用animation过渡,这一切都可以正常工作。 现在我想让它与交互式转换一起工作,所以我调用交互控制器的startInteractiveTransition:而不是animation控制器的animateTransition:再次使用self作为参数。 但是,如果我使用UIPercentDrivenInteractiveTransition作为交互控制器,则会在我的上下文(它是容器视图控制器本身)上调用_animator方法。 当然,我还没有实现这个私有的和无证的方法,所以它崩溃了… 我在执行中丢失了什么? UIPercentDrivenInteractiveTransition是否仅与Apple类兼容,因为它使用了一些实现魔法(因为它需要所有东西都应该放在UIViewanimation块中)? 文档和头文件看起来像我们可以实现我们自己的容器视图控制器,并仍然使用自定义转换,但这是真的还是只是一厢情愿的想法,因为没有人会真的这样做? 如果我不能使用UIPercentDrivenInteractiveTransition ,那么交互/animation逻辑究竟应该在哪里? 在UIViewControllerTransitionCoordinatorContext对象? 在UIViewControllerInteractiveTransitioning对象(最有可能的是,这个对象是驱动程序…)? 或者在UIViewControllerAnimatedTransitioning对象(这可能是真正的animation应该发生的地方,但是这意味着在交互过程中多次调用animateTransition: ?或者为交互式转换的每一步添加新的方法?) 编辑:文档说: 一个由百分比驱动的交互式转换对象驱动一个视图控制器消失和另一个视图控制器外观之间的自定义animation。 它依赖于一个转换animation代理(一个采用UIViewControllerAnimatorTransitioning协议的自定义对象)来设置和执行animation。 没有UIViewControllerAnimatorTransitioning协议。 假设这是一个错误,或者在iOS 7开发过程中发生了名称变化,实际上是UIViewControllerAnimatedTransitioning协议,那么我们如何将交互控制器与animation控制器相连? 我想这是视图控制器驱动转换的责任,但我没有看到任何API来做这个链接,所以这将意味着UIPercentDrivenInteractiveTransition确实为Apple类保留?

navigationController.viewControllers在iOS 8.2中以不同的方式工作

在我的项目中,我正在使用一些代码来处理后退button,如下所示。 NSMutableArray *VCs = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; if ([[VCs objectAtIndex:[VCs count] – 2] isKindOfClass:[LoginViewController class]]) { [VCs removeObjectAtIndex:[VCs count] – 2]; [VCs removeObjectAtIndex:[VCs count] – 2]; } [self.navigationController setViewControllers: VCs]; 在iOS 7中,我正在得到所需的结果。 但对于iOS版本8.2,可变数组VC中的值只是堆栈中的当前或topViewController。 但后退button将导航到所有以前的视图控制器。 但是他们都没有出现在导航堆栈中。ios8中的导航处理是否有任何改变? 我想从堆栈中删除login屏幕viewcontroller,以便点击后退button,它不会回到login屏幕。 我只在iOS 8.2中面对这个问题(可能在iOS 8和更高版本中)。 可能是什么问题? 编辑: 在prepareForSegue:中 ,我使用下面的代码: if([[segue identifier] isEqualToString:@"mediaDetailSegue1"]) { MovieDetailViewController *movieDetail; if(isIOS8SystemVersion) { movieDetail = ([[segue destinationViewController]viewControllers][0]); […]

更改导航上一步button的目的地

如何更改视图控制器的默认导航后退button带我到? 后退button通常会将您带回到先前的视图控制器。 但是如果我想让它回到两个视图控制器呢? 我的意思是我想改变视图控制器的后退button带我。 我不喜欢创build一个自定义后退button。 那还有别的办法吗? 可能是一个放松的继续链接到后退button什么的?

ViewController的出口视图第一个非零,然后从束加载时为零

我使用initWithNibName:bundle:从一个包中加载一个UIViewController 。 如果我在它的viewDidLoad设置了一个断点,我可以看到它的view被设置了。 在Interface Builder中查看About.xib时,我也可以看到这一点。 但是,一旦实际上第一次使用视图(根据我的应用程序的逻辑调用[self.navigationController pushViewController:viewController animated:YES] ),我得到这个错误: *终止应用程序由于未捕获的exception“NSInternalInconsistencyException”,原因:' – [UIViewController _loadViewFromNibNamed:bundle:]加载了“关于”笔尖,但没有设置视图sockets。 这也是触发viewDidLoad的调用。 所以显然在通话期间, view首先是非零(应该是),而后来显然变成了零。 如果在调用之前立即在debugging器中inputpo [viewController view] ,我会得到这个错误(这大概只是同一症状的另一个表示): 错误:执行被中断,原因:内部的ObjCexception断点(-3)。进程已经返回到expression式求值之前的状态。 我怎样才能加载和使用视图控制器结合现有的导航栏,而不会遇到这些错误? 更新如果我从故事板(不一定是我的主要故事板)而不是从XIB文件加载视图控制器,问题显然消失。

isBeingDismissed未设置viewWillDisappear:

我有一些代码来清理我的viewWillDisappear:我只想在视图移回父视图控制器时使用。 – (void)viewWillDisappear:(BOOL)animated { if ([self isMovingFromParentViewController] || [self isBeingDismissed]) { NSLog(@"isMovingFromParentViewController or isBeingDismissed"); // clean up } [super viewWillDisappear:animated]; } 该视图可以通过两种方式呈现:可以由导航控制器推送,也可以作为模式视图控制器(来自同一导航控制器)呈现。 如果它被推,然后popup(按后退button),我的清理代码运行。 如果它作为一个模态视图控制器呈现,然后解散,代码不会运行。 我这样解雇: [rootViewController dismissModalViewControllerAnimated:YES]; 我的问题是:当我解雇我的视图控制器时,为什么不是isBeingDismissed设置?

UIViewController中的ViewDidLoad方法 – 什么时候被调用?

我有一个名为LaunchController的UIViewController ,在应用程序第一次打开时在我的iPhone应用程序中启动: @interface LaunchController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> 然后,当一个button被点击,我推另一个视图控制器: MainController *c = [[MainController alloc] initWithImage:image]; [self presentModalViewController:c animated:NO]; MainController有以下构造函数,我使用: – (id)initWithImage:(UIImage *)img { self = [super init]; if (self) { image = img; NSLog(@"inited the image"); } return self; } 然后它有一个viewDidLoad方法如下: – (void)viewDidLoad { NSLog(@"calling view did load"); [super viewDidLoad]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; […]