`

ios调用dismissViewController的一个小陷阱

 
阅读更多

我们的APP从启动到进入主页面,是通过presentViewController构造了一个ViewController序列,类似于首页 -> 登陆页 -> 启动加载页 -> 主页面

其中,在启动加载页的viewDidAppear方法里做了很多逻辑处理:

-(void) viewDidAppear:(BOOL)animated{
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        
        clientInfo = [YLSClientInfo new];
        
        if([clientInfo needInit]){
            [self mkdirAndDatabaseFile];
        }else{
            [self refreshVersion:[clientInfo currentVersion]];
        }
        
       // 各种处理逻辑
    });
}

然后进入主页面之后,如果用户退出登陆,就需要回到首页,所以会在首页上调用dismissViewController方法。原先的代码类似这样:

UIViewController *origin = self.presentingViewController.presentingViewController;
if([origin isMemberOfClass:[YLSLoginViewController class]]){
    origin = self.presentingViewController.presentingViewController.presentingViewController;
}
[origin dismissViewControllerAnimated:NO completion:nil];

预期的结果是,直接回到首页,然后触发首页的viewDidAppear方法。实际上通过观察console warning才发现,中间启动加载页的viewDidAppear方法也被调用了。登陆页由于没有写viewDidAppear方法,所以没有发现,但我猜测如果有的话,也一样会被调用。似乎ViewController是按照顺序一个接一个出栈的,所以每一个“之前的”ViewController的viewDidAppear方法应该都会被触发

查了一下API,又上stackoverflow搜索了半天,似乎没有办法阻止这个默认行为。所以最后我的解决办法是在中间的Controller上加了标记:

-(void) viewDidAppear:(BOOL)animated{
    
    // 如果是由于调用了dismiss而触发了此方法,不进行初始化
    if(self.isDismissing){
        return;
    }
    
   // 初始化加载逻辑
}

YLSBootstrapViewController *bootstrapController = (YLSBootstrapViewController*)self.presentingViewController;
bootstrapController.isDismissing = YES;
                
UIViewController *origin = self.presentingViewController.presentingViewController;
if([origin isMemberOfClass:[YLSLoginViewController class]]){
    origin = self.presentingViewController.presentingViewController.presentingViewController;
}
[origin dismissViewControllerAnimated:NO completion:nil];

不知道大家有没有更好的做法
分享到:
评论

相关推荐

    iOS 调用相机相册

    要调用相机,首先需要创建一个`UIImagePickerController`实例,设置其`sourceType`属性为`.camera`,然后将其作为控制器的根视图显示。若要访问相册,将`sourceType`设置为`.photoLibrary`。 2. **权限管理** 在...

    iOS 调用外部程序

    总的来说,调用外部程序是iOS开发中的一个重要功能,它能增强用户体验,提供丰富的交互方式。掌握好这部分知识,对于开发出更加便捷、易用的应用至关重要。通过实践和研究提供的Demo,开发者可以更深入地理解并掌握...

    iOS相机摄像头的调用

    `UIImagePickerController`是苹果提供的一个核心框架,它允许开发者方便地在iOS应用中集成相机和照片库的功能。本教程将深入探讨如何使用`UIImagePickerController`来调用摄像头,并创建一个基本的相机界面示例。 ...

    ios 调用c++代码

    然后,如果你想在Objective-C类中调用这些C++代码,你需要声明一个Objective-C++接口。在.h文件中,声明一个C++方法: ```objc #import @interface MyClass : NSObject { // ... } - (void)callCppCode; @end ...

    ios一个app应用内部调用另一个新的app应用

    在标题和描述中提到的"ios一个app应用内部调用另一个新的app应用",实际上就是指通过URL Scheme实现iOS应用间的跳转。 首先,我们需要理解什么是URL Scheme。URL Scheme是一种类似于http或https的自定义协议,但它...

    iOS 调用系统分享

    这是一个弹出视图控制器,它会显示一个列表,让用户选择要通过哪个应用来分享内容。创建 `UIActivityViewController` 的基本步骤如下: 1. 准备分享内容:内容可以是文本、图片、URL 或其他数据类型。例如,你可以...

    iOS 调用系统功能

    移动开发,iOS,调用系统功能总结大全,自己已经试验过了

    ios调用webservice实例代码

    (1)写一个调用webservice的类webservice(代码中有两个,一个是使用NSURLConnection写的类,还有一个是ASIHttpRequest写的webservice调用类) a.同步调用 b.异步调用 c.返回数据的处理 soap调用返回的数据经常放在...

    针对iOS调用相机的二次封装支持本地保存

    总的来说,这个项目通过二次封装iOS系统的相机功能,实现了更简洁的代码结构、更灵活的配置选项以及强大的本地保存和删除功能,为iOS开发者提供了一个高效、易用的相机解决方案。这有助于开发者快速集成相机功能,...

    Unity for iOS 调用UIDatePicker

    在这里简单,实现一个 Unity for iOS UIDatePicker来输入日期日间的功能。主要有两个方面:1、unity 与 ios的交互、ios下的objective-c的相关api。具体的看代码吧. 对应的博文:...

    ios-iOS调用系统相册拍照.zip

    整个调用方法: [takePhoto sharePicture:^(UIImage *HeadImage){ [self.headBtn setBackgroundImage:HeadImage forState:UIControlStateNormal]; }];

    H5页面调用ios方法

    对于iOS平台而言,如何在H5页面中调用原生iOS方法是混合式开发中的一个重要环节。 #### 二、关键技术点 1. **WebView与JavaScript桥接** - **WebView**:在iOS中,可以通过UIWebView或WKWebView加载H5页面。 - *...

    iOS和h5互相调用通类,内含一个打电话的处理,并且防止多次弹出打电话的选择框

    iOS和h5互相调用通类,内含一个打电话的处理,并且防止多次弹出打电话的选择框。 有这个通用处理类,能处理一切h5页面显示与回调。并且用双层代码实现了进度条。调用十分简单,h5页面调用ios客户端处理也很简单。

    在存在iOS项目添加Cordova实现H5调用设备相册

    在iOS项目中集成Cordova并实现H5调用设备相册的功能,是移动应用开发中的一个常见需求。Cordova是一个开源框架,它允许开发者使用HTML、CSS和JavaScript来构建原生移动应用程序。通过Cordova,我们可以利用Web技术来...

    Uniy调用ios相册 相机 获取头像

    在iOS平台上,Unity3D作为一个跨平台的游戏引擎,可以与原生iOS系统进行深度交互,实现调用系统相册和相机的功能。这个过程涉及到的主要知识点包括Unity的插件开发、Objective-C编程、C#与Objective-C之间的桥接,...

    iOS调用系统相机

    1. **UIImagePickerController**: 这是苹果提供的一个内置类,用于在iOS应用中展示和控制系统相机或相册。首先,你需要导入`UIKit`框架,然后创建一个`UIImagePickerController`实例。你可以设置它的源类型(相机或...

    ios通过HTTP调用获取返回值

    这表明在iOS端,我们可能需要发送一个名为`da`的键值对。然而,这个例子没有显示完整的PHP代码,所以具体的处理逻辑无法得知。 总的来说,iOS通过HTTP调用获取返回值涉及到网络请求的实现,包括GET和POST方法。GET...

    ios-IOS JS与OC互相调用(JavaScriptCore).zip

    例如,定义一个`Bridge`类,暴露两个方法供JavaScript调用: ```objc @interface Bridge : NSObject - (NSString *)sayHello:(NSString *)name; - (NSNumber *)addNumbers:(NSNumber *)a and:(NSNumber *)b; @...

    delphi xe ios调用Safari 检查ios网络状态

    1. 安装CocoaPods,这是一个iOS的依赖管理工具。 2. 在你的项目中创建一个新的CocoaPods配置文件(Podfile),并添加Reachability库,如:`pod 'Reachability'` 3. 运行`pod install`命令,这会在你的项目中添加...

    ios-调用系统相机和相册并显示出图片.zip

    本项目"ios-调用系统相机和相册并显示出图片.zip"提供了一个名为"TakePhotoDemo"的示例,它将帮助开发者了解如何在自己的应用中实现这一功能。以下是对这个项目的详细解析: ### 1. 调用系统相机 在iOS中,我们...

Global site tag (gtag.js) - Google Analytics