iPhone视图切换基础

iPhone视图切换基础,iphone,cocoa-touch,uiview,uiviewcontroller,Iphone,Cocoa Touch,Uiview,Uiviewcontroller,我只是想了解一下iPhone的简单视图切换,并创建了一个简单的应用程序来帮助我理解它 我已经包含了根控制器中用于切换视图的代码。我的应用程序只有一个工具栏,上面有三个按钮,每个按钮都链接到一个视图。这是我的代码,但我认为有更有效的方法来实现这一点吗?有没有办法找出/删除当前显示的视图,而不必执行if语句来查看其中一个是否有超类 我知道我可以使用标签栏来创建类似的效果,但我只是用这个方法来帮助我练习一些技巧 -(IBAction)switchToDataInput:(id)sender{ if

我只是想了解一下iPhone的简单视图切换,并创建了一个简单的应用程序来帮助我理解它

我已经包含了根控制器中用于切换视图的代码。我的应用程序只有一个工具栏,上面有三个按钮,每个按钮都链接到一个视图。这是我的代码,但我认为有更有效的方法来实现这一点吗?有没有办法找出/删除当前显示的视图,而不必执行if语句来查看其中一个是否有超类

我知道我可以使用标签栏来创建类似的效果,但我只是用这个方法来帮助我练习一些技巧

-(IBAction)switchToDataInput:(id)sender{
 if (self.dataInputVC.view.superview == nil) {
  if (dataInputVC == nil) {
   dataInputVC = [[DataInputViewController alloc] initWithNibName:@"DataInput" bundle:nil];
  }
  if (self.UIElementsVC.view.superview != nil) {
   [UIElementsVC.view removeFromSuperview];
  } else if (self.totalsVC.view.superview != nil) {
   [totalsVC.view removeFromSuperview];
  }

  [self.view insertSubview:dataInputVC.view atIndex:0];
 }
}

-(IBAction)switchToUIElements:(id)sender{
 if (self.UIElementsVC.view.superview == nil) {
  if (UIElementsVC == nil) {
   UIElementsVC = [[UIElementsViewController alloc] initWithNibName:@"UIElements" bundle:nil];
  }
  if (self.dataInputVC.view.superview != nil) {
   [dataInputVC.view removeFromSuperview];
  } else if (self.totalsVC.view.superview != nil) {
   [totalsVC.view removeFromSuperview];
  }

  [self.view insertSubview:UIElementsVC.view atIndex:0];
 }

}

-(IBAction)switchToTotals:(id)sender{
 if (self.totalsVC.view.superview == nil) {
  if (totalsVC == nil) {
   totalsVC = [[TotalsViewController alloc] initWithNibName:@"Totals" bundle:nil];
  }
  if (self.dataInputVC.view.superview != nil) {
   [dataInputVC.view removeFromSuperview];
  } else if (self.UIElementsVC.view.superview != nil) {
   [UIElementsVC.view removeFromSuperview];
  }

  [self.view insertSubview:totalsVC.view atIndex:0];
 }
}

我建议不要每次要显示时都重新创建每个视图,而是在需要时将正确的子视图放在前面。比如:

-(void)init{
  // The 3 view controllers below are ivars, so we can access in other methods 
  dataInputVC = [[DataInputViewController alloc] initWithNibName:@"DataInput" bundle:nil];   
  UIElementsVC = [[UIElementsViewController alloc] initWithNibName:@"UIElements" bundle:nil];
  totalsVC = [[TotalsViewController alloc] initWithNibName:@"Totals" bundle:nil];

  // Add as subviews (rearrange so that correct view appears first)
  [self.view addSubview:dataInputVC.view];
  [self.view addSubview:UIElementsVC.view];
  [self.view addSubview:totalsVC.view];
}

-(IBAction)switchToDataInput:(id)sender{
  [self.view bringSubviewToFront:dataInputVC.view];
}

-(IBAction)switchToUIElements:(id)sender{
  [self.view bringSubviewToFront:UIElementsVC.view];
}

-(IBAction)switchToTotals:(id)sender{
  [self.view bringSubviewToFront:totalsVC.view];
}

不要重新发明
UITabBarController
。拧动工具栏并将其替换为选项卡栏,然后所有这些行为都将为您内置开箱即用。那应该容易多了!告诉我结果如何。

谢谢你的回复。我认为if语句应该防止每次都创建视图,但只能在视图不存在时创建。正如我在didReceiveMemoryWarning中包含的一段代码,该代码将删除非活动视图,因此如果发生这种情况,则需要创建一个新视图,这也是一种延迟加载的形式。如果用户从未单击其中一个视图,则将永远不会加载它。这样行吗?我喜欢你在那里所做的,它更整洁,但是如果同时加载所有三个视图,它不会导致内存损失吗?谢谢,若你们想让你们的代码和didReceiveMemoryWarning一起工作,那个么就在每个IB操作中包含你们的延迟加载代码,而不是像我所做的那个样在init方法中。你的代码中最难看的是removeFromSuperview调用Shi Jonathan,谢谢你的回复,我知道我可以使用UITabBarController来完成这项工作!我之所以不这样做,是因为我把它作为一个学习过程来帮助我了解如何使用视图,而使用工具栏只是一种快速而肮脏的方法,它创建了三个按钮来切换到三个不同的视图,但我自己做所有的工作,以便我可以从中学习。谢谢