1

我通过界面生成器创建了一个名为“YLJTestViewController”的 ViewController,代码如下:

-(IBAction)DoneButtonPressed:(id)sender
{
    YLJTestViewController *testViewController = [[YLJTestViewController alloc]initWithNibName:@"YLJTestViewController" bundle:nil];
    [self.navigationController pushViewController:testViewController animated:YES];
    //[self.view addSubview:testViewController.view];
}

但是当我使用[self.view addSubview:textViewController.view];它时它崩溃了,但是使用[self.navigationController pushViewController:testViewController animated:YES];它效果很好,那么有什么区别?我以为它们是一样的......

4

5 回答 5

3

pushViewController就像将一张纸添加到一叠纸上,而addSubView就像将一张纸粘在另一张纸上。

前一个视图和被推送的视图控制器的新视图之间没有明确的关系(就像纸片在堆栈中仍然分开)。而父视图将保持对其子视图的强引用(如胶水)。

于 2012-06-18T13:14:31.827 回答
2

-addSubview:是 UIView 的一个方法。它将一个视图插入到另一个视图中。就像在页面上添加一个按钮。

-pushViewController:是 UINavigationController 的一个方法。它将视图控制器推送到导航堆栈上。就像从表格视图滑动到详细信息视图一样。

简而言之,-addSubview:构成一个视图。-pushViewController:是视图之间的过渡。

于 2012-06-18T13:11:39.267 回答
1

正如此 Apple 支持论坛帖子中的 sptrakesh 所述:

addSubview 是一个较低级别的功能,您可以使用它向父/主视图添加其他视图。pushViewController 用与新视图控制器关联的视图替换窗口中的当前主视图。当您想在当前视图之上以模态方式显示视图(阻止前一个视图)时,您可以使用 presentModalViewController。如果您对模态视图控制器使用全屏,则 pushViewController 和 this 在 UI 行为方面没有太大区别。当您使用 pushViewController 时,您可以“弹出”到已推送的视图控制器数组中的任何视图控制器,这对于嵌套模式视图来说并不容易。

于 2012-06-18T13:09:45.773 回答
0

在您的情况下,问题不在于addSubview:vs.的使用pushViewController:animated:,而只是您使用addSubview:.

[self.view addSubview:textViewController.view]; // misspelled

应该是(将 x 替换为 s)

[self.view addSubview:testViewController.view]; // correct

addSubview:至于vs.的区别pushViewController:animated:,其他人已经给出了很好的答案。基本上,pushViewController:animated:当您替换整​​个屏幕的内容以及addSubview:将非全屏 UI 元素添加到现有视图时,您应该使用。

当我们谈论 a 的视图时UIViewControllerpushViewController:animated:应该是您首选的方法。

于 2012-06-18T13:16:19.687 回答
0

我最近遇到了与addSubviewand类似的问题pushViewController。这里的每个人都发表了很好的评论,但我要补充一点:

通常addSubview不单独使用。您通常将它与 一起使用presentModalViewController,或者在控制器包含的情况下,addChildViewController

总而言之:

  1. 如果您使用导航控制器,则使用 p ushViewController/popViewController来浏览您的应用程序。
  2. 如果您手动切换视图,请使用presentModalViewController.
  3. 如果您正在进行控制器遏制,请使用addChildViewController.
  4. 如果您使用故事板,请使用 Segues。
于 2012-10-01T11:48:45.950 回答