【问题标题】:-self parentViewController- dismissModalViewController not working on iOS 5-self parentViewController-dismissModalViewController 在 iOS 5 上不起作用
【发布时间】:2011-12-12 13:31:55
【问题描述】:

那么,这有什么线索吗?我不得不使用 [self dismiss modalviewcontroller 来关闭 modalviews。有趣的事实:在关闭 tabbarcontroller 时,我仍然可以使用对 parentviewcontroller 的引用,但在关闭常规视图控制器时,不是。

【问题讨论】:

    标签: objective-c xcode ios5


    【解决方案1】:

    我找到了一篇很好的博客文章来解释这个问题:

    http://omegadelta.net/2011/11/04/oh-my-god-they-killed-parentviewcontroller/

    在这篇文章之后,我为 UIViewController 创建了一个类别方法:

    - (UIViewController*) myParentViewController {
        UIViewController* ret = [self parentViewController];
        if(ret == nil) {
            if([self respondsToSelector:@selector(presentingViewController)]) {
                ret = [self presentingViewController];
            }
        }
        return ret;
    }
    

    【讨论】:

      【解决方案2】:

      我在 iOS 4 上构建了一个添加 presentingViewController 的类别。

      它会在 iOS 5 上自行禁用。

      您可以无缝使用它。请参阅backward-modal

      【讨论】:

        【解决方案3】:

        我在商店中拥有的应用程序是使用 ios SDK 4.3 构建的,并使用 self.parentViewController dismissModalViewControllerAnimated:YES。它继续适用于 IOS 5 设备。我认为它是基于 sdk 4.3 构建的。现在,当我使用新的 xcode 和 ios 5.0 sdk 更新它时,它不会按原样工作,我必须更改所有视图关闭内容以使用上面提到的条件选择器解决方法。(糟糕!)

        只是想我会提到从父母那里解雇应该在 ios 5 上工作(至少在我的情况下使用 ios 4.3 sdk)。我不能代表以前的 sdks 或其他带有 parentViewController 的选择器。

        【讨论】:

          【解决方案4】:

          对于您关闭模态视图控制器的特定用例,您可能需要牢记 Apple 文档 -dismissModalViewControllerAnimated: 中讨论部分的 第二段

          父视图控制器负责解除模式 它使用呈现的视图控制器 presentModalViewController:animated: 方法。如果你调用这个方法 然而,在模态视图控制器本身上,模态视图 控制器自动将消息转发到其父视图 控制器。

          但是,如果您在模态视图控制器本身上调用此方法, 模态视图控制器自动将消息转发到它的 父视图控制器。

          Jason 的解决方案也很棒而且很有帮助!谢谢!

          【讨论】:

            【解决方案5】:
            -(UIViewController *)getParentViewController{   
                float currentVersion = 5.0;
                float sysVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
            
                if (sysVersion >= currentVersion) {
                    // iOS 5.0 or later version of iOS specific functionality hanled here 
                       return self.presentingViewController;
                }
                else {
                    //Previous than iOS 5.0 specific functionality
                       return self.parentViewController;
            
                }
            }
            

            【讨论】:

            • 或者,[self respondsToSelector:@selector(presentingViewController)];。另外,不要在方法前面加上get
            • 为@IvanVučica +1。根据系统版本做出决策是一种糟糕的形式。让对象告诉你。
            【解决方案6】:

            在 iOS 5 上,您需要使用 presentingViewController 选择器而不是 parentViewController 选择器。

            【讨论】:

            • 谢谢,伙计。我只是希望编译器能给出任何提示,人们应该怎么知道呢?阅读整个该死的文档?
            • 问题是现有的 4.x 代码不再适用于使用 parentViewController 的 iOS5 设备。此外,如果我使用 presentingViewController,任何 4.x 代码都会崩溃,因为它无法识别选择器。如果我错了,请纠正我。我开始对 iOS5 有一种很不好的感觉。
            • 感谢杰森和维尼!这个 iOS 5 开始给我带来痛苦:(
            • @Vinnie - 这不是最好的解决方案,但您始终可以实现一种方法来有条件地确定应该使用哪个选择器来获取呈现/父 VC。 -(UIViewController*) getPresentingViewController:(UIImagePickerController*) picker { return ([picker respondsToSelector:@selector(presentingViewController)] ? [picker presentingViewController] : [picker parentViewController]); }
            • 是的,我知道解决方法。我最终使用了我自己创建的 customParentViewController 属性。我要选择的是我以前在应用商店中的应用。他们坏了。有些我很久没有更新了,也不想深入研究代码来解决苹果的问题。
            猜你喜欢
            • 2012-08-10
            • 2012-11-28
            • 1970-01-01
            • 2012-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-11
            相关资源
            最近更新 更多