2010-03-26 76 views
1

我只是想让我的头绕着iPhone的简单视图切换,并创建了一个简单的应用程序来尝试并帮助我理解它。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]; 
} 
} 

回答

1

我建议不要在每次想要显示时重新创建每个视图,而只是在需要时将正确的子视图带到前面。类似于:

-(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]; 
} 
+0

感谢您的回复。 我认为if语句应该防止每次创建视图,但只有当它不存在时才会创建视图。正如我在didReceiveMemoryWarning中包含了一段代码,它将删除非活动视图,因此如果发生这种情况,则需要创建一个新视图,并且如果用户从未点击其中一个视图,则需要创建一个延迟加载的形式那么它将永远不会被加载。那样有用吗? 我喜欢你在那里做的很整齐,但它会不会因为同时加载所有三个视图而导致记忆惩罚? 谢谢 – 2010-03-26 16:56:55

+0

如果你想让你的代码与didReceiveMemoryWarning一起工作,那么在每个IB动作中包含你的延迟加载代码,而不是像我所做的那样在init方法中。关于你的代码丑陋的东西是removeFromSuperview调用 – pheelicks 2010-03-26 17:03:54

1

不要改造UITabBarController。拧紧工具栏并将其替换为选项卡栏,然后所有这些行为都将为您打开。这应该更容易!让我知道结果如何。

+0

嗨乔纳森, 感谢您的答复,我明白我可以使用UITabBarController来做到这一点!我之所以没有这样做,是因为我将这个作为一个学习过程来帮助我使用视图,并使用工具栏来创建三个按钮,以切换到三个不同的视图,但完成所有工作我自己,以便我可以从中吸取教训。 谢谢 – 2010-03-26 17:21:33