2010-05-27 27 views
0

我有一个应用程序与TabBar。iPhone:如何使一个代理控制器,可以选择不同的意见+控制器

之一的TabBar连接的视图实际上是可变的:

在该视图的第一开口,它应表现出一个登录对话框。如果用户登录,则登录视图结束并显示实际的数据视图。之后,如果用户返回到此选项卡,则数据视图将立即显示,因此不会再有登录对话框视图。直到现在,我已经通过直接操作标签栏项目的导航控制器的视图控制器数组来解决这个问题:最初,它被设置为显示登录视图。用户登录后,将从导航控制器中删除登录控制器,然后插入实际数据视图。

不过,我对这个解决方案并不满意,因为一旦有超过5个标签项目就会导致问题。

因此,我想知道如何避免这个导航控制器“修补”,而是有一个新的根控制器为此选项卡,然后将调用登录视图或立即显示数据视图。

注意:设计原因为什么数据视图不能只弹出登录的模式视图控制器。因此,我真的很喜欢提供类似于代理控制器的东西,它可以将功能引导至其选择的其他两个控制器之一。

我该如何做到这一点?

或者我在这里使用其他概念吗?

回答

0

我的建议是有两个完全分开的视图控制器。登录完成后,通过删除登录视图控制器并添加内容视图控制器来更改标签栏的视图控制器阵列。事情是这样的:

- (void) didLogin { 
    UITabBarController *tabBarController = self.tabBarController; 
    NSMutableArray *array = [NSMutableArray arrayWithARray:tabBarController.viewControllers]; 
    int idx = [array indexOfObject:self]; 
    UIViewController *contentViewController = //Create or get a chached copy of the content view controller 
    //Optionally here you could copy the tab bar item rather than setting it up within the contentViewController. 
    contentViewController.tabBarItem = self.tabBarItem; 
    [array replaceObjectAtIndex:idx withObject:contentViewController]; 
    tabBarController.viewControllers = array; 
    tabBarController.selectedViewController = contentViewController; 
} 

编辑:

如果你是更多视图控制器内,如果它显示通常选择一个选项卡时,导航控制器会自动检测。如果你以编程的方式进行编程,我认为你只需要做同样的事情,但手动。事情是这样的:

- (void) didLogin { 
    UITabBarController *tabBarController = self.tabBarController; 
    NSMutableArray *array = [NSMutableArray arrayWithARray:tabBarController.viewControllers]; 
    if (array.count > 5 && [array indexOfObject:self] >= 5) { 
     [tabBarController popToRootViewControllerAnimated:NO]; 
     [tabBarController.moreNavigationController pushViewController:contentViewController animated:NO]; 
     //Note: Not sure if this next line should be contentViewController or moreNavigationController. 
     tabBarController.selectedViewController = contentViewController; 
    } else { 
     //Normal method above 
    } 
} 
+0

感谢您付出的努力,埃德,但我目前正在使用您的建议,我想我已经解释了这一点。显然不太好。 这种技术对我不可用,因为一旦将特定的标签项移动到“更多”区域(只有当您有超过5个标签项时),它才会工作。除非我做了其他的错误。 您是否成功使用过> 5个选项卡项目,其中此选项卡位于更多区域内? – 2010-05-29 08:28:18

+0

增加了另一个选项 – 2010-05-31 13:04:57

+0

埃德,我会给你一个绿色的对号,试图帮助我。这不是我可以使用的,我最终以一种控制器切换其视图的方式走向了相反的方向。这要求控制器同时处理同一类中的两个功能,但它看起来功能上比我更清洁,而不是混淆标签栏的预先分配的控制器。 – 2010-06-14 10:06:16

0

托马斯:>这就要求控制器处理同一类

一个清洁的方法可能是创建一个代理控制器类两种功能。该类将采用登录类和数据显示类,并将在下面切换它们之间的功能。该班的使用者不会说出任何区别。