Ios parentViewController返回不正确的父级

Ios parentViewController返回不正确的父级,ios,modalviewcontroller,Ios,Modalviewcontroller,我正在从导航子视图(连接屏幕)中创建模式视图(OnlinePeerBrowser)。我需要引用模态视图的父视图中的方法。出于某种原因,模态视图认为它的父视图是rootView,而不是我创建模态的视图 我做错了什么 创建模态视图的代码 @implementation ConnectionScreen { - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [sup

我正在从导航子视图(连接屏幕)中创建模式视图(OnlinePeerBrowser)。我需要引用模态视图的父视图中的方法。出于某种原因,模态视图认为它的父视图是rootView,而不是我创建模态的视图

我做错了什么

创建模态视图的代码

@implementation ConnectionScreen {
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    self.title = @"ConnectionScreen";
    }
    return self;
}

...

 - (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type {
if (type == GKPeerPickerConnectionTypeOnline) {
     OnlinePeerBrowser *controller = [[OnlinePeerBrowser alloc] 
                                     initWithNibName:@"OnlinePeerBrowser" bundle:nil];
    [self presentModalViewController:controller animated:YES];
    NSLog(@"my current view title: %@", [self title]);
    NSLog(@"parent of the controller title: %@", [controller.parentViewController title]);
输出为:

 my current view title: ConnectionScreen
 parent of the controller title: Home
正在从ConnectionScreen实例中创建模态视图并将其显示为ModalViewController。为什么它使用根窗口作为父窗口

-------更多关于这个----------- 我向苹果提交了一个bug,认为我很聪明;)。实际上,他们通过按下导航控制器(滚动至底部查看)发现我的代码存在问题。我不知道我做错了什么。他们还确保了这类事情不会在5.0中发生,正如Vinnie在下面陈述的那样,优雅地退出解决API更改

如果有人能看到我在推下面的视图时做错了什么,我将不胜感激。 -------更多关于这个-----------

刚刚收到苹果公司的回复,苹果公司在iOS开发的ModalViewController上提交了一份错误报告。我正试图判断他们的反应。 (请注意,支持人员的回复是保密的。因为你们都是注册的苹果开发者,所以我想可以与大家分享。)

从下面的回答中,我无法判断他们是否在说我创建导航控制器和推送根视图的方法是错误的,或者他们是否承认这个错误并声明他们在iOS 5中对此进行了协调

下面是我提交的代码,用于重复“bug”

对我提交的bug的响应:


错误标题:模式视图的父级不正确 复制步骤: 创建导航控制器 推送标题为“主”的视图控制器 在“主视图”视图控制器上创建一个按钮,用于推送另一个视图控制器“NewView” 在“NewView”上,创建一个按钮,用于调出模式视图 在该模式视图中,调用self.parentViewController.title

预期vrs实际结果: 模态视图的父标题应为NewView;但是,它显示模态视图的父视图是主视图

注: 我的解决方法是在使模态视图可见之前,在模态视图上设置一个属性myParent


他们的反应


工程部已根据以下信息确定该问题的行为符合预期:

此测试应用程序将在5.0中以UIViewControllerHierarchInConsistency退出。ApplicationIDFinishLaunching方法非常可疑(也是5.0异常的原因)。窗口的根视图控制器作为视图控制器的子视图被推送,该视图控制器的视图随后被添加到窗口中

这可能导致各种不一致,因此我们现在在5.0上提出这个问题。请注意,在5.0中,parentViewController不再返回模式presenter。我们添加了方法presentingViewController来覆盖这种情况。现在保留parentViewController以指示视图控制器之间的包含关系


他们声称的代码可疑:

  • (BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{


}

这都在同一个函数中,因此所有代码都在同一时间运行。您说过,该应用程序在UI方面正常运行,因此NSLogs应该放在OnlinePeerBrowser的viewDidLoad函数中。然后它应该可以正常工作。

这都在同一个函数中,因此所有代码都在同一时间运行。您说过,该应用程序在UI方面正常运行,因此NSLogs应该放在OnlinePeerBrowser的viewDidLoad函数中。然后它应该可以正常工作。

如果在iOS 5中测试此属性,您将获得不正确的属性值。从iOS 5开始,调用presentModalViewController时不再设置parentViewController。相反,您必须使用presentingViewController属性。但是,如果您支持其他版本的iOS,您将不得不稍微花哨一点。或者执行如下检查:

if([self respondsToSelector:@selector(presentingViewController)])
  ;//... do stuff to the presentingViewController
else
  ;//... do stuff to the parentViewController
您还可以设置自己的委托或创建一些customParentViewController属性以确保安全。我亲自走了这条路

有些人只想调用[self.parentViewController dismissModalViewController]。在这种情况下,请使用[self dismissModalViewController],因为它只会为您爬升堆栈并自行关闭


是的,在iOS 4及以下版本中编写的任何代码现在都已在iOS 5设备上被破解,因此请在应用商店中查看您的其他应用程序

如果在iOS 5中测试此属性,您将获得此属性的错误值。从iOS 5开始,调用presentModalViewController时不再设置parentViewController。相反,您必须使用presentingViewController属性。但是,如果您支持其他版本的iOS,您将不得不稍微花哨一点。或者执行如下检查:

if([self respondsToSelector:@selector(presentingViewController)])
  ;//... do stuff to the presentingViewController
else
  ;//... do stuff to the parentViewController
您还可以设置自己的委托或创建一些customParentViewController属性以确保安全。我亲自走了这条路

有些人只想调用[self.parentViewController dismissModalViewController]。在这种情况下,请使用[self dismissModalViewController],因为它只会为您爬升堆栈并自行关闭


是的,在iOS 4及以下版本中编写的任何代码现在都已在iOS 5设备上被破解,因此请在应用商店中查看您的其他应用程序

是的,UI代码正在工作。但我想要的代码不是。我有一个委托方法,它使用self.parentViewController调用选择器方法。在该委托方法中,我还检查了标题。不幸的是,它仍然认为父视图是根视图。作为一种解决方法,我已经为父视图创建了一个属性,并且在创建model view.BTW之前设置了该属性,代码将如何处理