我通过界面构建器创建一个名为“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];
它运作良好,那有什么区别?我认为它们是相同的......
答案 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)
我最近遇到了addSubview
和pushViewController
的类似问题。这里的每个人都发表了很好的评论,但我想补充一点:
通常addSubview
本身不会被使用。您通常将其与presentModalViewController
一起使用,或者在控制器包含的情况下使用addChildViewController
。
总结如下:
ushViewController
/ popViewController
来浏览您的应用。presentModalViewController
。addChildViewController
。