iPhone视图切换基础
我只是想了解一下iPhone的简单视图切换,并创建了一个简单的应用程序来帮助我理解它 我已经包含了根控制器中用于切换视图的代码。我的应用程序只有一个工具栏,上面有三个按钮,每个按钮都链接到一个视图。这是我的代码,但我认为有更有效的方法来实现这一点吗?有没有办法找出/删除当前显示的视图,而不必执行if语句来查看其中一个是否有超类 我知道我可以使用标签栏来创建类似的效果,但我只是用这个方法来帮助我练习一些技巧iPhone视图切换基础,iphone,cocoa-touch,uiview,uiviewcontroller,Iphone,Cocoa Touch,Uiview,Uiviewcontroller,我只是想了解一下iPhone的简单视图切换,并创建了一个简单的应用程序来帮助我理解它 我已经包含了根控制器中用于切换视图的代码。我的应用程序只有一个工具栏,上面有三个按钮,每个按钮都链接到一个视图。这是我的代码,但我认为有更有效的方法来实现这一点吗?有没有办法找出/删除当前显示的视图,而不必执行if语句来查看其中一个是否有超类 我知道我可以使用标签栏来创建类似的效果,但我只是用这个方法来帮助我练习一些技巧 -(IBAction)switchToDataInput:(id)sender{ 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来完成这项工作!我之所以不这样做,是因为我把它作为一个学习过程来帮助我了解如何使用视图,而使用工具栏只是一种快速而肮脏的方法,它创建了三个按钮来切换到三个不同的视图,但我自己做所有的工作,以便我可以从中学习。谢谢