更新了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开发中,数据传递是应用中不可或缺的一部分。开发者经常需要在不同的视图控制器之间...在实际项目中,开发者还可以结合使用其他设计模式,如通知中心、Key-Value Observing(KVO)等,来灵活地处理数据传递问题。
5. **发送数据**:在子控制器中,当需要返回数据时,调用代理方法: ```objc [self.delegate childViewController:self didSendValue:@"这是要传递的值"]; ``` 四、注意事项 1. **弱引用**:为了避免循环引用,...
主视图控制器(ParentViewController)会有一个UITableView,显示所有父类别;点击父类别后,通过UIStoryboardSegue跳转到子类别视图控制器(SubCategoryViewController),显示对应的子类别列表。 3. ...
首先,让我们理解一下父控制器(ParentViewController)和子控制器(ChildViewController)的概念: 1. **父控制器(Parent ViewController)**:父控制器负责管理一组子控制器,可以为它们提供上下文,比如数据...
3. KVO(Key-Value Observing):适合观察特定属性变化,但需要手动管理观察者,且可能导致性能问题。 总结,iOS代理反向传值是实现组件间通信的有效手段,尤其适用于父子控制器间的交互。通过正确理解和运用,可以...
第一种方法: 代码如下:self.parentViewController.music=self.music[indexPath.row];不能满足 第二种做法:把整个数组传递给它 第三种做法:设置一个数据源,设置播放控制器的数据源是这个控制器。self....
在iOS开发中,Swift语言是苹果官方推荐的编程语言,用于构建iOS、iPadOS、macOS、watchOS和tvOS的应用程序。本压缩包“ios-swift传值.zip”聚焦于Swift中的值传递机制,特别关注了在iOS应用开发中常见的三种传值方式...
在iOS应用开发中,页面间的数据传递是必不可少的环节,特别是在多个视图控制器之间切换时。本教程将详细讲解四种常见的...通知广播广泛,但可能导致性能问题。理解并熟练掌握这些方法,将有助于你更好地构建iOS应用。
5. **实例化与使用**:在实际的代码中,我们可能会看到如何创建被委托对象,设置代理,以及如何在代理方法中处理事件的示例。 6. **内存管理**:在使用代理模式时,需要注意代理对象与被委托对象之间的强引用循环。...
在iOS开发中,"反向传值"是一个常见的需求,特别是在导航控制器的子控制器之间进行数据传递时。这里我们将深入探讨标题"ios反向传值汇总"所涵盖的三种主要方法:Block、代理(Delegate)以及广播(Notification)。...
class ParentViewController: UIViewController, ChildViewControllerDelegate { //... func childViewControllerDidFinish(_ childViewController: ChildViewController, withData data: Any) { // 在这里处理从...
3. **属性与方法**:UIViewController有若干内置属性,如`view`(用于展示内容的主视图)、`parentViewController`(父视图控制器,如果有的话)、`childViewControllers`(子视图控制器数组)。此外,还有`...
此外,UIViewController还提供了一些重要的属性,如`view`(当前UIViewController的根视图)、`parentViewController`(父控制器,如果有的话)、`childViewControllers`(子控制器数组)等,它们可以帮助构建复杂的...
在iOS应用开发中,视图控制器间的跳转是常见的用户...在处理复杂跳转逻辑时,开发者应确保正确管理视图控制器的生命周期,以避免内存泄漏和用户体验问题。同时,保持代码的清晰和可维护性也是优秀iOS开发者的重要素质。
父子控制器是一种特殊的控制器关系,其中父控制器(ParentViewController)负责管理一个或多个子控制器(ChildViewController)。这种关系不是继承关系,而是通过编程实现的组合关系。它允许开发者在单个父控制器中...
在初始化时,我们需要传入childVcs(所有子控制器)和parentViewController(父控制器)。在设置UI界面时,我们将所有的子控制器添加到父控制器中,并创建一个UICollectionView来展示内容。UICollectionView的布局...
#### 5. 全局变量 在AppDelegate或其他公共类中定义全局变量,作为不同控制器间共享数据的媒介。 ```swift // AppDelegate.swift var sharedData: Any? // 在子控制器中设置数据 AppDelegate.shared.sharedData = ...
- 必须在支持AVFoundation和AVKit的macOS或iOS环境中使用,否则可能会遇到兼容性问题。 总的来说,`pyobjc-framework-AVKit`为Python开发者提供了便利的工具,让他们能够在Python应用中实现与Apple原生应用相当的...