这是添加/删除视图的正确方法吗?

时间:2012-02-05 18:01:09

标签: objective-c ios cocoa-touch

假设我有4个视图控制器(称为FirstView,SecondView,ThirdView,FourthView),这些控制器是以编程方式创建的,并且都位于不同的文件中:

在AppDelegate.m中,didFinishLaunchingWithOptions方法我有这些代码行

self.rootViewController = [[rootViewController alloc]initWithNibName:@"rootViewController" bundle:nil];
self.window.rootViewController = self.rootViewController;

在rootViewController.m中,我有

的loadview方法
self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
self.firstView = [[FirstView alloc]init];
[self.view addSubview:self.firstView.view]; 

该代码工作正常 - 显示第一个视图。

让我们继续

在FirstView.m中使用switchViews方法

注意:请参阅代码中的注释

 self.secondView = [[SecondView alloc] initWithNibName:@"SecondView" bundle:nil];


// I think here secondView is added to rootViewController - right ?
[self.view.superview addSubview:self.secondView.view];

// Here first view is removed from rootViewController - right ?
[self.view removeFromSuperview];

以下是添加/删除视图的方法。

这种做法是否正确? 你能推荐一个更好的解决方案吗?

我已经阅读了有关UINavigationController的内容,但我认为在这种情况下它不是一个解决方案。

2 个答案:

答案 0 :(得分:2)

你说:

  

我有4个视图(称之为FirstView ...

然后你说:

[self.view addSubview:self.firstView.view]; 

这让我觉得FirstView实际上并不是UIView - 正如您声称的那样。相反,它可能是UIViewController - 一个完全不同的野兽。

如果我的怀疑是正确的 - 那么你就可以“偏离轨道”了。

将其超越您的示例代码段:

self.secondView = [[SecondView alloc] initWithNibName:@"SecondView" bundle:nil];

// I think here secondView is added to rootViewController - right ?
[self.view.superview addSubview:self.secondView.view];

// Here first view is removed from rootViewController - right ?
[self.view removeFromSuperview];

这绝对不是一个好主意。原因如下:

首先:您的视图控制器没有明确“知道”您所访问和删除子视图的超级视图的任何内容 - 所以它不应该这样做。或者,您也可以创建自己的视图并插入/删除子视图 - 这不仅是完全可以接受的,而且也是常见的做法。

第二:如果这些实际上UIViewController就像我认为的那样 - 那么你就没有正确处理它们到UIViewController事件链 - 这意味着方法这些子类如viewDidAppear:viewDidUnload不会触发。

答案 1 :(得分:0)

从我在您的代码中看到的内容,UINavigationController似乎会有所帮助。如果您不想要导航栏,您肯定可以隐藏它,但UINavigationController中的方法可以帮助您切换视图。

如果您的视图只需要暂时显示,您还可以使用模态视图控制器。可以找到模态视图控制器的示例here

如果您还没有,请查看Apple的View Controller Programming Guide