Presenting view contro…

来源:互联网 发布:web服务器搭建域名 编辑:程序博客网 时间:2024/05/27 14:12

在做ios 开发的时候,有时候我们需要临时让用户输入信息,常用到的是 presentViewController这个函数,首先大致了解一下这个函数

这个函数全名如此 

 

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_AVAILABLE_IOS(5_0);
可一看到第一个参数UIViewcontroller,意味着只要是视图控制器都可以被 present,剩下两个是动画以及完成回调。

 

官方文档上说调用 present函数会中断当前工作流程,属于一种临时中断。这也就是跟你push一个viewcontroller的本质区别。

另外需要注意的就是 呈现与被呈现视图之间有一个指向关系。

这是uiviewcongtroller.h 里面的一段代码

 

// This property has been replaced by presentedViewController.@property(nonatomic,readonly) UIViewController *modalViewController NS_DEPRECATED_IOS(2_0, 6_0);// The view controller that was presented by this view controller or its nearest ancestor.@property(nonatomic,readonly) UIViewController *presentedViewController  NS_AVAILABLE_IOS(5_0);// The view controller that presented this view controller (or its farthest ancestor.)@property(nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);

看后面俩个属性,当你在当前视图控制器里面调用presentviewcontroller函数,实际上函数内部实现对这两个属性做了赋值。

 

好,函数介绍到此。

那实际使用的时候,一般不会出什么问题,不过有些问题值得思考。

比如我最近碰到一个发生在调用时。

 

 [self presentViewController:photoPicker animated:YES completion:nil];

 

Presenting view controllers on detached view controllers isdiscouraged

出现这段文字。我上网看到的答案包括stackflow上面的

 

 [self.view.window.rootViewController presentViewController:controller animated:YES completion:nil];
将调用者由self替换为 当前app的rootviewcontroller,这段文字就没有了。于是引发了我对detach view controller的判定。

 

一般来说我们呈现一个viewcontroller里面的内容,经常采用的方式是用navigationcontroller与tabbarcontroller来管理视图控制器。在这种情况下,呈现的视图控制器都在一个app维护的控制器堆栈里面。

而有一种情况就是通过self.viewaddsubview:AviewController.view也可以呈现出某个视图控制器。这种情况虽然看上去跟push的结果没什么不同,但是实际上这个被呈现的view的controller并没有在当前app的视图堆栈里,也就是所谓的

detachviewcontroller,如果你在这个分离之外的视图控制器里面做present调用,就会出现上述问题。

所以判定是否为分离视图,就是看它是不是处在当前app的控制器堆栈里面。

显然app的 rootviewcontroller当然是处于堆栈里,并且是堆栈最底层的视图控制器。所以这种解决方案在一定程度上是可行的。

0 0
原创粉丝点击