我正在导航子视图(ConnectionScreen)中创建模态视图(OnlinePeerBrowser)。我需要从Modal视图的父视图中引用方法。出于某种原因,模态视图认为它的父元素是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。为什么使用根窗口作为父窗口?
-------更多关于此----------- 我向Apple提出了一个错误,认为我很聪明;)。他们实际上通过推送导航控制器确定了我的代码的问题(滚动到底部看)。我不知道我做错了什么。他们还确保在5.0中没有发生这种类型的事情,优雅地退出解决API变化,如Vinnie所述。
如果有人能够看到我在下面推送的视图出错了,我将不胜感激。 -------更多关于-----------
在收到有关iOS开发的ModalViewController的错误报告后,刚收到Apple的回复。我试图去除他们的回应。 (注意支持响应说保密。既然你都是注册的Apple开发人员,我认为可以分享。)
从下面的回复中,我不知道他们是否说我创建导航控制器和推送根视图的方法是错误的,或者如果他们承认错误并声明他们在iOS 5中协调了这一点
以下是我提交的重复“错误”的代码。
对我提交的错误的回应:
重现步骤: 创建导航控制器 推送标题为“Home”的视图控制器 在“Home”视图控制器上创建一个按钮,用于推送另一个视图控制器“NewView” 在'NewView'上创建一个拉出模态视图的按钮 在该模态视图中调用self.parentViewController.title
预期vrs实际结果: 模态视图的父标题应该是NewView;但是,它显示模态视图的父视图是Home。
注意: 我的解决方法是在使模态视图可见之前在模态视图myParent上设置属性。
他们的回应
Engineering已根据以下信息确定此问题的行为符合预期:
此测试应用程序将在5.0中以UIViewControllerHierarchyInconsistency退出。 applicationDidFinishLaunching方法是高度怀疑(和5.0的原因)异常。窗口的根视图控制器被推送为视图控制器的子视图,然后将视图添加到窗口中。
这可能导致各种不一致,因此我们现在提出5.0问题。请注意,在5.0中,parentViewController不再返回模态演示者。我们添加了presentationViewController方法来覆盖这种情况。现在保留parentViewController以指示视图控制器之间的包含关系。
他们声称的代码是可疑的:
{
// Override point for customization after application launch.
self.navigationController = [[UINavigationController alloc] init];
self.window.rootViewController = self.viewController;
[self.navigationController pushViewController:self.window.rootViewController animated:NO];
// Add the navigation controller's view to the window and display.
[self.window addSubview:self.navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
答案 0 :(得分:3)
如果在iOS 5中对此进行测试,您将获得此属性的错误值。从iOS 5开始,调用presentModalViewController时不再设置parentViewController。相反,您将不得不使用presentViewController属性。但是,如果你支持其他版本的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设备上破解,因此请检查应用商店中的其他应用。
答案 1 :(得分:1)
这都在同一个函数中,因此所有代码都在同一时间运行。你说应用程序在UI方面运行正常,所以NSLogs应该放在OnlinePeerBrowser的viewDidLoad函数中。然后它应该正常工作。