pushViewController和addSubview的区别是什么

时间:2012-06-18 13:05:45

标签: ios interface-builder

我通过界面构建​​器创建一个名为“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];它运作良好,那有什么区别?我认为它们是相同的......

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

简而言之,-addSubview:组成了一个视图。 -pushViewController:是视图之间的转换。

答案 2 :(得分:1)

正如sptrakesh在this Apple Support forum thread中指出的那样:

  

addSubview是一个较低级别的功能,可用于添加其他功能   查看父视图/主视图。 pushViewController取代了   窗口中的当前主视图,其中包含与新关联的视图   查看控制器。您可以在需要时使用presentModalViewController   在当前的顶部以模态方式显示视图(阻止上一个视图)   视图。如果你的模态视图控制器使用全屏,则有   在pushViewController和这方面没有太大的区别   UI的行为方式。当你使用pushViewController时,你可以" pop"至   已经存在的视图控制器数组中的任何视图控制器   推,这对于嵌套的模态视图来说并不容易。

答案 3 :(得分:0)

在您的情况下,问题不在于addSubview:pushViewController:animated:的使用,而在使用addSubview:时只是一个拼写错误。

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

应该(用s代替x)

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

至于addSubview:pushViewController:animated:之间的差异,其他人已经得到了很好的答案。基本上,您应该在替换entires屏幕内容时使用pushViewController:animated:,而在将非全屏UI元素添加到现有视图时使用addSubview:

当我们谈论UIViewController的观点时,pushViewController:animated:应该是您首选的方法。

答案 4 :(得分:0)

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

通常addSubview本身不会被使用。您通常将其与presentModalViewController一起使用,或者在控制器包含的情况下使用addChildViewController

总结如下:

  1. 如果您使用的是导航控制器,请使用p ushViewController / popViewController来浏览您的应用。
  2. 如果您要手动切换视图,请使用presentModalViewController
  3. 如果您正在进行控制器遏制,请使用addChildViewController
  4. 如果您使用的是故事板,请使用Segues。