`
lizaochengwen
  • 浏览: 663198 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IOS5 parentViewController 问题

阅读更多
更新了XCODE4.2的朋友可能会奇怪,原来在XCODE4.0的时候一点问题都没有的代码,出现了不少的bug,其中比较典型的就是
[plain] view plaincopy
[UIViewController parentViewController] 
返回nil。

苹果文档是这样写的
[html] view plaincopy
parentViewController 
The parent of the current view controller. (read-only) 
 
@property(nonatomic, readonly) UIViewController *parentViewController 
Discussion 
Parent view controllers are relevant in navigation, tab bar, and modal view controller hierarchies. In each of these hierarchies, the parent is the object responsible for displaying the current view controller. If you are using a view controller as a standalone object—that is, not as part of a view controller hierarchy—the value in this property is nil. 
 
Prior to iOS 5.0, if a view did not have a parent view controller and was being presented modally, the view controller that was presenting it would be returned. This is no longer the case. You can get the presenting view controller using the presentingViewController property. 
 
presentingViewController 
The view controller that presented this view controller. (read-only) 
 
@property(nonatomic, readonly) UIViewController *presentingViewController 
Discussion 
The default implementation of this property walks up the view hierarchy, starting from this view controller. The first view controller it finds that received the presentViewController:animated:completion: method, or that has its definesPresentationContext property set to YES is returned as the value of the property. It keeps walking up the hierarchy until it finds a value to return or it gets to the root view controller. 


这个问题出来IOS5的SDK里面,IOS5新增了一个方法是拿 ViewController 的presentingViewController,在IOS4的时候,如果调用parentViewController的时候如果为空,它会一直网上找到顶层的presentingViewController,但是IOS5就把他们分开了。为了兼容IOS4和IOS5 直接调用这个方法来拿parentViewController。


[plain] view plaincopy
+(UIViewController*)getPresentingViewController:(UIViewController*)aViewController 

    if (!aViewController) { 
        NSLog(@"viewController is nil"); 
        return nil; 
    } 
    UIViewController *presentingViewCtrl=nil; 
    if ([aViewController parentViewController]) { 
        //ios4 
        presentingViewCtrl = aViewController.parentViewController; 
    }else if([aViewController respondsToSelector:@selector(presentingViewController)]){ 
        //ios5 
        if ([aViewController performSelector:@selector(presentingViewController)]) { 
            presentingViewCtrl = [aViewController performSelector:@selector(presentingViewController)]; 
        }else{ 
            NSLog(@"No presentingViewController"); 
        } 
    }else{ 
        NSLog(@"No presentingViewController"); 
    } 
    return presentingViewCtrl; 


原文地址:http://blog.csdn.net/a0199133/article/details/7048231
分享到:
评论

相关推荐

    iOS 多种传值方式

    在iOS开发中,数据传递是应用中不可或缺的一部分。开发者经常需要在不同的视图控制器之间...在实际项目中,开发者还可以结合使用其他设计模式,如通知中心、Key-Value Observing(KVO)等,来灵活地处理数据传递问题。

    IOS代理方法反向传值

    5. **发送数据**:在子控制器中,当需要返回数据时,调用代理方法: ```objc [self.delegate childViewController:self didSendValue:@"这是要传递的值"]; ``` 四、注意事项 1. **弱引用**:为了避免循环引用,...

    QQ折叠列表(ios)

    主视图控制器(ParentViewController)会有一个UITableView,显示所有父类别;点击父类别后,通过UIStoryboardSegue跳转到子类别视图控制器(SubCategoryViewController),显示对应的子类别列表。 3. ...

    ios-父子控制器的简单实现.zip

    首先,让我们理解一下父控制器(ParentViewController)和子控制器(ChildViewController)的概念: 1. **父控制器(Parent ViewController)**:父控制器负责管理一组子控制器,可以为它们提供上下文,比如数据...

    iOS 代理反向传值

    3. KVO(Key-Value Observing):适合观察特定属性变化,但需要手动管理观察者,且可能导致性能问题。 总结,iOS代理反向传值是实现组件间通信的有效手段,尤其适用于父子控制器间的交互。通过正确理解和运用,可以...

    iOS开发中音频工具类的封装以及音乐播放器的细节控制

    第一种方法: 代码如下:self.parentViewController.music=self.music[indexPath.row];不能满足 第二种做法:把整个数组传递给它 第三种做法:设置一个数据源,设置播放控制器的数据源是这个控制器。self....

    ios-swift传值.zip

    在iOS开发中,Swift语言是苹果官方推荐的编程语言,用于构建iOS、iPadOS、macOS、watchOS和tvOS的应用程序。本压缩包“ios-swift传值.zip”聚焦于Swift中的值传递机制,特别关注了在iOS应用开发中常见的三种传值方式...

    IOS开发页面传值

    在iOS应用开发中,页面间的数据传递是必不可少的环节,特别是在多个视图控制器之间切换时。本教程将详细讲解四种常见的...通知广播广泛,但可能导致性能问题。理解并熟练掌握这些方法,将有助于你更好地构建iOS应用。

    IOS应用源码Demo-委托代理-毕设学习.zip

    5. **实例化与使用**:在实际的代码中,我们可能会看到如何创建被委托对象,设置代理,以及如何在代理方法中处理事件的示例。 6. **内存管理**:在使用代理模式时,需要注意代理对象与被委托对象之间的强引用循环。...

    ios反向传值汇总

    在iOS开发中,"反向传值"是一个常见的需求,特别是在导航控制器的子控制器之间进行数据传递时。这里我们将深入探讨标题"ios反向传值汇总"所涵盖的三种主要方法:Block、代理(Delegate)以及广播(Notification)。...

    iOS开发逆向传值之代理传值

    class ParentViewController: UIViewController, ChildViewControllerDelegate { //... func childViewControllerDidFinish(_ childViewController: ChildViewController, withData data: Any) { // 在这里处理从...

    IOS应用源码——视图控制器(无动画版).zip

    3. **属性与方法**:UIViewController有若干内置属性,如`view`(用于展示内容的主视图)、`parentViewController`(父视图控制器,如果有的话)、`childViewControllers`(子视图控制器数组)。此外,还有`...

    iOS App开发中UIViewController类的使用教程

    此外,UIViewController还提供了一些重要的属性,如`view`(当前UIViewController的根视图)、`parentViewController`(父控制器,如果有的话)、`childViewControllers`(子控制器数组)等,它们可以帮助构建复杂的...

    iOS中模态Model视图跳转和Push视图跳转的需求实现方法

    在iOS应用开发中,视图控制器间的跳转是常见的用户...在处理复杂跳转逻辑时,开发者应确保正确管理视图控制器的生命周期,以避免内存泄漏和用户体验问题。同时,保持代码的清晰和可维护性也是优秀iOS开发者的重要素质。

    ios-父子控制器.zip

    父子控制器是一种特殊的控制器关系,其中父控制器(ParentViewController)负责管理一个或多个子控制器(ChildViewController)。这种关系不是继承关系,而是通过编程实现的组合关系。它允许开发者在单个父控制器中...

    iOS 页面滑动与标题切换颜色渐变的联动效果实例

    在初始化时,我们需要传入childVcs(所有子控制器)和parentViewController(父控制器)。在设置UI界面时,我们将所有的子控制器添加到父控制器中,并创建一个UICollectionView来展示内容。UICollectionView的布局...

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

    #### 5. 全局变量 在AppDelegate或其他公共类中定义全局变量,作为不同控制器间共享数据的媒介。 ```swift // AppDelegate.swift var sharedData: Any? // 在子控制器中设置数据 AppDelegate.shared.sharedData = ...

    Python库 | pyobjc-framework-AVKit-6.2.1.tar.gz

    - 必须在支持AVFoundation和AVKit的macOS或iOS环境中使用,否则可能会遇到兼容性问题。 总的来说,`pyobjc-framework-AVKit`为Python开发者提供了便利的工具,让他们能够在Python应用中实现与Apple原生应用相当的...

Global site tag (gtag.js) - Google Analytics