iOS:对removeFromSuperview和切换视图感到困惑

时间:2011-07-06 12:21:34

标签: iphone ios4

iPhone开发的新手,但我第一次接受了一个大项目而且我有点卡住了。

基本上,应用程序将从设置屏幕开始,然后单击按钮转到带有多个选项按钮的仪表板。每个按钮将导致带有表格的不同导航视图。

我接近这个的方式是从一个带有按钮的UIViewController开始,我已经连接了但当你点击按钮时我做了:

[self.view removeFromSuperview];

UIViewController *newView = [[UIViewController alloc] initWithNibName:@"Dashboard" bundle:nil];

[self.view addSubview:newView.view];

第二个视图未加载。我只是得到一个空白的屏幕。我是否需要在第一个控制器中引用第二个?

另外,我是以正确的方式接近这个吗?只要我删除了SuperSuperview,我就能按下按钮加载导航控制器吗?

对不起,如果这不太清楚,我已经阅读了很多书籍,但似乎无法理解这一点。

由于

6 个答案:

答案 0 :(得分:3)

新视图中没有任何内容,而是当前视图中的问题。您已从超级视图中删除self.view

[self.view removeFromSuperview];

所以添加到self.view的内容都不会显示,因为self.view本身已被删除。

答案 1 :(得分:1)

当从父控制器呈现子控制器/视图时,您应该考虑使用presentViewController。最后,当您希望孩子消失并且父母重新出现时,请使用dismissViewControllerAnimated

在父视图控制器中:

ChildViewController * child = [[ChildViewController alloc] init];
[self presentViewController:child animation:YES completion:Nil];

在子视图控制器中,即。在某个动作处理程序中:

-(IBAction)close:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:Nil];
}
恕我直言,你应该养成将实例变量命名为实例化的习惯。在您的示例中,您将实例newView命名为newViewController。这样您就可以确保不会将视图与视图控制器混淆。

答案 2 :(得分:0)

[self.view removeFromSuperview];

您已从超级视图中删除了该视图

[self.view addSubview:newView.view];

但是您将新视图添加到刚刚从superview中删除的同一视图中。它没有显示在任何地方。

答案 3 :(得分:0)

你的第三行添加newView作为self.view的子视图,但你刚从它的superview中删除了self.view。

我建议阅读有关视图控制器的更多信息。您需要为每个“屏幕”设置一个视图控制器,因此一个用于您的设置屏幕,一个用于仪表板,一个用于每个表格,依此类推。然后,通过从导航控制器的堆栈中推送和弹出这些视图控制器来管理哪一个是可见的。

答案 4 :(得分:0)

这会删除self.view,这很可能会破坏对象,因为没有其他引用它:

[self.view removeFromSuperview];

在这里,您要创建一个UIViewController,并将其视图添加到self.view,这可能不是您想要的:

UIViewController *newView = [[UIViewController alloc] initWithNibName:@"Dashboard" bundle:nil];

[self.view addSubview:newView.view];

查看UINavigationController,以便您可以轻松地将屏幕与一些内置动画进行交换。 Here's更多关于他们的信息。这是一个tutorial

答案 5 :(得分:0)

UIViewController的view不应从视图控制器控件之外的视图层次结构中删除或添加到视图层次结构中。虽然你现在可能能够使用这种操作,但将来也不会这样。

阅读视图控制器here

基本思想是你呈现视图控制器,然后它将负责为你操纵视图层次结构。

因此,更好的入门方法是做这样的事情;

[viewController1 presentModalViewController:viewController2 animated:YES];

这行代码将为viewController2提供默认的模态动画(从底部滑入)。如果你想要一个不同的动画,你可以将modalPresentationStyle更改为UIModalPresentationStyleviewController1枚举中的一个常量(请注意viewController1,而不是{{1} }})。

如果您想要更像Clock应用程序的内容,请查看标签栏控制器。如果您想要更像“邮件”应用程序的内容,请查看导航控制器。