`

presentModalViewController和dismissModalViewControllerAnimated的使用总结

    博客分类:
  • ios
 
阅读更多
在实际开发中,如果要弹出或隐藏视图:
我们常用到presentModalViewController方法dismissModalViewControllerAnimated方法。


presentModalViewController:弹出视图
dismissModalViewControllerAnimated:隐藏视图

弹出视图:

FeedbackViewController *feedbackViewController = [[FeedbackViewController alloc] initWithNibName:@"FeedbackViewController" bundle:nil];

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:feedbackViewController];

    [self presentModalViewController:navigationController animated:YES];



隐藏视图:

[self dismissModalViewControllerAnimated:YES];




关于这两个方法的几点说明:

1.iPhone上弹出/隐藏 视图时,使用为全屏模式

On iPhone and iPod touch devices, the view of modalViewController is always presented full screen.


2.搞清楚谁是presenting,谁是presented

如果A弹出B,那么A为presenting,B为presented。


3.隐藏视图的策略

The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, however, it automatically forwards the message to the presenting view controller.

我们假如A弹出B
就是说,A负责隐藏B;如果我们在B中调用dismissModalViewControllerAnimated方法,那么编译器,自动将消息发送给A。
等等,什么消息?




简单的理解,当执行presentModalViewController:方法:在A弹出B时:

执行A的viewWillDisappear方法,
通知B执行自己的viewWillAppear方法和viewDidAppear方法
执行A的viewDidDisappear方法

当执行dismissModalViewControllerAnimated方法:隐藏B时:

执行B的viewWillDisappear
通知A执行自己的viewWillAppear方法和viewDidAppear方法
执行B的viewDidDisappear方法


以下我做了个测试来输出一轮AB切换:
A:More
B:Feed

2012-12-27 14:01:23.666 WTV[1627:11303] -More--viewWillDisappear----

2012-12-27 14:01:23.672 WTV[1627:11303] -Feed--viewWillAppear----

2012-12-27 14:01:24.086 WTV[1627:11303] -Feed--viewDidAppear----

2012-12-27 14:01:24.087 WTV[1627:11303] -More--viewDidDisappear----

2012-12-27 14:01:25.745 WTV[1627:11303] -Feed--viewWillDisappear----

2012-12-27 14:01:25.745 WTV[1627:11303] -More--viewWillAppear----

2012-12-27 14:01:26.156 WTV[1627:11303] -More--viewDidAppear----

2012-12-27 14:01:26.157 WTV[1627:11303] -Feed--viewDidDisappear----

当我们信心慢慢,庆幸我们可以了解了这两个方法时,悲剧发生了:

4.苹果官方已经把这两个方法 Deprecated in iOS 6.0.


- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated;

- (void)dismissModalViewControllerAnimated:(BOOL)animated;


取而代之的是:

[self presentViewController:navigationController

                       animated:YES

                     completion:^(void){

                         // Code

                     

                     }];

[self dismissViewControllerAnimated:YES

                             completion:^(void){

                                 // Code

                             }];




新接口的差别是提供了一个参数,允许你传入一个block。这个block的回调方法在VC的viewWillDisappear方法后调用。也就是被隐藏的VC对象被释放后运行回调。
这样做的好处:可以方便做多个UI效果之间的衔接和转换。
分享到:
评论

相关推荐

    presentModalViewController实现的启动动画

    `presentModalViewController`自iOS 8之后已经被废弃,但在iOS 7及更早版本中广泛使用。现在,我们通常会使用`UINavigationController`的`pushViewController:animated:`或`present:animated:completion:`来替代。 ...

    ModalViewDemo

    - iOS 8之后,推荐使用`UIPresentationController`和` presentViewController:animated:completion:`来代替`presentModalViewController:animated:`,因为后者已经废弃。 总结来说,`ModalViewDemo`是一个关于如何...

    第七节 利用ModalViewController切换View.docx

    与`UINavigationController`不同,`UINavigationController`通过导航栏来管理并切换多个视图,`ModalViewController`则更适合在视图数量较少且不需要导航堆栈的情况下使用,比如用于弹出对话框或表单填写等场景。...

    ZBarSDK-64_Demo

    3. `Documentation`: 提供了ZBarSDK的文档,帮助开发者理解和使用API。 4. `LICENSE`: 开源许可文件,定义了使用ZBarSDK的法律条款。 **集成ZBarSDK到你的项目** 1. **添加库文件**:将`ZBarSDK`目录中的`libzbar....

    ios 使用ZBar读取条形码和二维码

    这篇博客文章“ios 使用ZBar读取条形码和二维码”提供了一个详细教程,教你如何集成ZBar库并实现扫描功能。 首先,我们需要了解ZBar库。ZBar是由Simon Woodside开发的一个图像识别库,专门用于解析一维条形码和二维...

    iOS中视频播放的基本方法总结

    总结来说,MPMoviePlayerController和MPMoviePlayerViewController适合简单场景,但在现代iOS开发中,AVPlayer和AVPlayerViewController由于其灵活性和更丰富的功能,成为更推荐的选择。开发者可以根据具体需求,...

    IOS 二维码扫描 ZBar和Zxing

    对于弹出式ViewController,通常会使用UIStoryboardSegue或者presentModalViewController来展示扫描界面,用户扫描完成后,通过代理或者闭包将结果返回到主界面。而对于自定义嵌入界面,你可能需要在你的主界面中...

    iOS工程师培养计划

    - 协议和分类的使用:`@protocol` - 内存管理的基础:`retain`, `release`, `drain`, `autorelease`, `NSAutoreleasePool` - 深复制与浅复制的概念:`NSCopying` - 常用的`NSFoundation`类掌握:`NSData`, `...

    点击列表出现详情(简单的列表分组)

    此外,如果我们使用的是UICollectionView,基本的流程是相同的,只是数据源和代理方法会稍有不同,如`collectionView:numberOfItemsInSection:`和`collectionView:cellForItemAtIndexPath:`。UICollectionView提供了...

    UIImagePickerController拍照与摄像

    完成配置后,将其push到导航控制器的栈中,或者使用presentModalViewController来展示,以便用户进行交互。 在用户完成拍摄或选择后,UIImagePickerController会调用其代理对象实现的协议方法。我们通常需要遵循...

    unity for ios 上传IOS机本地的头像 相机的获取 相册的获取 截图拍照

    在Unity引擎中开发iOS应用时,涉及到用户交互和媒体访问是非常常见的需求,特别是涉及到上传头像、使用相机和相册功能以及截图拍照。本教程将详细介绍如何在Unity中实现这些功能,以满足iOS平台的应用需求。 1. **...

    Xamarin Froms 调用相机拍照和图库选择图片

    在移动应用开发中,Xamarin.Forms 是一个强大的跨平台框架,允许开发者使用 C# 和 .NET 库创建原生 iOS、Android 和 UWP 应用。本教程将深入探讨如何在 Xamarin.Forms 应用中调用设备的相机进行拍照以及访问图库选择...

    VideoCamera2

    iOS 相机的调用,相册使用方法 UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; // if (![UIImagePickerController isSourceTypeAvailable: ...

    自定义弹窗.zip

    可以将其添加到当前视图控制器的view上,然后调整其frame或者使用presentModalViewController方法。 6. **生命周期管理**:确保在适当的时候释放资源,比如在视图消失时移除动画和通知,防止内存泄漏。 在实际项目...

    iOS block传值

    跳转到第二个页面时,确保正确设置NavigationController或者使用presentModalViewController。完成数据传递后,记得在适当的时候销毁Block,以避免循环引用问题。 6. **内存管理**: 注意Block会捕获其作用域内的...

    iOS页面跳转及数据传递(三种)

    可以使用 `presentModalViewController:animated:` 来显示一个新的控制器,该控制器会覆盖当前视图。而 `dismissModalViewControllerAnimated:` 用于关闭模态视图,返回到之前的状态。 3. **直接添加视图(Add ...

    iPhone源码分析(委托模式)

    3. C: 使用`presentModalViewController:animated:`方法显示ModalViewController,创建了一个模态视图,MainViewController不再控制屏幕显示,而是由ModalViewController接管。 ModalViewController中的`delegate`...

    利用苹果自带相机进行录像的代码

    在iOS应用开发中,苹果设备提供了内置的相机功能,允许用户通过...为了在实际项目中使用这段代码,开发者需要确保已经导入了`UIKit`和`MobileCoreServices`框架,并处理好权限问题,因为访问相机需要用户的授权。

    IOS 图片上传处理 图片压缩 图片处理 --X枫林1

    在iOS开发中,图片处理是常见的需求之一,包括图片上传和图片压缩。本文将围绕这两个主题进行详细讨论,以帮助iOS开发者理解如何有效地管理和优化图片资源。 首先,我们需要获取用户的照片。在iOS中,我们可以使用`...

    IOS源码之页面之间数据传送(通过delegate)

    首先,我们需要了解什么是代理以及如何设置和使用。 代理(Delegate)是一种设计模式,它允许对象之间进行松散耦合的通信。在iOS中,我们通常通过遵循特定的协议(Protocol)来实现代理。在这个例子中,我们将创建...

Global site tag (gtag.js) - Google Analytics