因IOS版本导致的模态视图控制器dismissModalViewControllerAnimated调用问题

今天用模态视图控制器(Modal View Controller)时遇到了一个很狗血的问题,按理说presentModalViewController和dismissModalViewControllerAnimated应该成对出现,一般情况下presentModalViewController会在parentViewController被直接调用,用来弹出一个新视图;而dismissModalViewControllerAnimated则一般在childViewController用来dismiss自己,它的原理是将dismiss消息转发给了parentViewController进行dismiss,问题就在怎将dismiss消息转发给parentViewController,以前我一直以为是

[self.parentViewController dismissModalViewControllerAnimated:YES];

之前在(Xcode4.0)模拟器(iphone 4.3)上跑了也没问题,今天换了台mac(Xcode4.2)上机器(IOS5)时却发现不管用了,赶紧查资料,果然是系统版本问题:

[self.parentViewController dismissModalViewControllerAnimated:YES]; (ios5前)
[self.presentingViewController dismissModalViewControllerAnimated:YES]; (ios5后)

于是回自己机器(Xcode4.0)试着改为

[self.presentingViewController dismissModalViewControllerAnimated:YES];

结果Xcode(4.0)直接报错,说找不着presentingViewController,改为

[[self presentingViewController] dismissModalViewControllerAnimated:YES];

警告可能不响应presentingViewController,不管了,先在模拟器(iphone 4.3)上跑,发现不行(Xcode4.0没有iphone 5.0模拟器)!赶紧换到Xcode4.2的那个机器,跑iphone 5.0模拟器发现可以,连警告都没有,可是一跑iphone 4.3模拟器又悲剧了,这让人情何以堪,无奈我只能调用前先判断一下:

    if ([self respondsToSelector:@selector(presentingViewController)]) {
        [[self presentingViewController] dismissModalViewControllerAnimated:YES];
    }
    else
    {
       [[self parentViewController] dismissModalViewControllerAnimated:YES]; 
    }

跑了一下,发现两个模拟器总算不蹦了,上机器两个也算都正常了。最终完美的方案是使用Xcode 4.2代码写成:

if ([self respondsToSelector:@selector(presentingViewController)]) {
        [[self presentingViewController] dismissModalViewControllerAnimated:YES];
    }
    else
    {
       [[self parentViewController] dismissModalViewControllerAnimated:YES]; 
    }

最后总结一下:IOS5后有很多旧的函数方法已经被新的函数方法所取代,但是目前的开发我们还要兼顾部分的IOS4的用户,所以有些变更的函数方法我们就得留意,在自己不确定一个函数是否被支持时最好用respondsToSelector检测一下其是否响应。另外Xcode也是能升级到最新版本就升级到最新版本以避免我遇到的麻烦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值