【问题标题】:Changing views keeps giving me attempt to present vc1 on vc whose view is not in the window hierarchy更改视图不断让我尝试在视图不在窗口层次结构中的 vc 上呈现 vc1
【发布时间】:2015-03-30 02:37:02
【问题描述】:

我创建了一个测试应用程序来了解视图/视图控制器的工作原理以及如何在没有情节提要或 nib 的情况下以编程方式在它们之间导航。

我基本上设置了一个名为 Viewcontroller 的rootViewController,它设置在AppDelegate 中。

此视图在启动时显示 view1,其中包含一个 uibutton,该按钮调用rootViewController 中的通知以显示 view2。但是,当我这样做时,我不断收到警告:

Warning: Attempt to present <View1: 0x7be66c80> on <ViewController: 0x7be62980> whose view is not in the window hierarchy!

我的控制视图控制器代码如下:

#import "ViewController.h" #import "View1.h" #import "View2.h" @interface 视图控制器 () @结尾 @implementation 视图控制器 -(无效)加载视图{ [超级负载视图]; } -(void)viewDidAppear:(BOOL)动画{ NSLog(@"视图出现"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"view1" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(view1:) name:@"view1" object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:@"view2" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(view2:) name:@"view2" object:nil]; [自我展示视图1]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // 处理所有可以重新创建的资源。 } -(void)view1:(NSNotification*) 通知{ NSLog(@"显示view1"); [自我dismissViewControllerAnimated:是完成:无]; [自我展示视图1]; } -(无效)showView1{ dispatch_async(dispatch_get_main_queue(), ^{ [self.view.window.rootViewController presentViewController:[[View1 alloc]init] 动画:YES 完成:nil]; }); } -(void)view2:(NSNotification*) 通知{ NSLog(@"显示view2"); [自我dismissViewControllerAnimated:是完成:无]; [自我展示视图2]; } -(无效)showView2{ dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:[[View1 alloc]init] 动画:YES 完成:nil]; }); } @结尾

编辑:我忘了说 view1 最初显示时没有任何错误或问题。

编辑:view1 和 view2 的代码完全相同,只是它们发送不同的通知:

#import "View1.h" @界面 View1 () @结尾 @实现视图1 -(无效)加载视图{ [超级负载视图]; self.view.frame = [[UIApplication sharedApplication].keyWindow bounds]; // 在此处查看设置。 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [按钮添加目标:自己 动作:@selector(touchedLogin:) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"Login" forState:UIControlStateNormal]; button.layer.cornerRadius=1; button.frame = CGRectMake(self.view.bounds.size.width/2-100, self.view.bounds.size.height-200, 200, 60.0); [按钮 setTitleEdgeInsets:UIEdgeInsetsMake(5.0, 0.0, 0.0, 0.0)]; //[_window setBackgroundColor:[UIColor whiteColor]]; [self.view addSubview:button]; } -(void)touchedLogin:(id*)sender{ [[NSNotificationCenter defaultCenter] postNotificationName:@"view2" object:nil]; } @结尾

【问题讨论】:

  • 如果在 View1 中按下按钮时出现错误,则需要显示该按钮的操作方法中的代码。
  • 我已经添加了代码。两个视图是相同的,只是另一个发送通知以显示另一个视图

标签: ios objective-c viewcontroller presentviewcontroller


【解决方案1】:

您收到此错误是因为您使用 animation 关闭 View1,然后立即调用 showView2(实际上显示 View1,因为您在该方法中有 [View1 alloc]init])。因为动画需要一些时间,所以您尝试在 View1 仍在屏幕上时呈现 View1,而不是 ViewController。一般来说,像这样一个接一个地进行解雇和演示并不是一个好主意。如果您在没有动画的情况下进行解雇,我认为它可能会起作用(尽管我从不这样做)。

【讨论】:

  • 我已经尝试删除所有动画,但仍然出现错误。我也尝试过在解雇和演示上使用调度异步但没有成功
  • @thegalah,是的,我不确定这是否可行。在您的代码中使用 dispatch_async 是不必要的,因为一切都在主线程上。你的整个方法不好。不要在解雇后立即进行演示。如果你想从 View1 转到 View2,让 View1 呈现 View2。此外,像您一样使用通知也不是最好的方法。当您有多个控制器需要通知某些操作时,它们最适合使用,而不仅仅是像您这里的一个。
  • 如何根据需要在视图之间导航。我是ios新手哈哈
  • @thegalah,这个问题太宽泛了,我无法回答。有很多方法可以做到这一点,并且您的应用程序可以采用许多结构。根视图控制器通常是容器控制器之一,如导航控制器、标签栏控制器或拆分视图控制器。我建议您阅读“iOS 视图控制器编程指南”和“iOS 视图控制器目录”,以全面了解各种可能性。
  • 我想我找到了改变视图的正确方法。它并没有真正改变观点,但它确实有效。基本上,我将初始化的 viewcontroller 添加为 childviewcontroller,并使用以下命令将 viewcontrollers 视图添加为子视图:UIViewController * vc=[[View2 alloc]init]; [self addChildViewController:vc]; [self.view addSubview:vc.view];
猜你喜欢
  • 2013-05-04
  • 2017-07-18
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多