以正确的方式识别UITabBarItems视图控制器实例

时间:2011-08-19 19:44:16

标签: iphone uiviewcontroller uitabbarcontroller uitableview uitabbaritem

我有一个带Tab键的应用程序可以打开不同的视图控制器,如下所示:

firstViewController = [[UITableViewController alloc] init];
UINavigationController *firstNavigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
[firstNavigationController setTabBarItem:[[UITabBarItem alloc] initWithTitle:@"Add" image:[UIImage imageNamed:@"Add.png"] tag:1]];

[viewControllers addObject:firstNavigationController];

secondViewController = [[UITableViewController alloc] init];
UINavigationController *secondNavigationController = [[UINavigationController alloc] initWithRootViewController:secondViewController];
[secondNavigationController setTabBarItem:[[UITabBarItem alloc] initWithTitle:@"List" image:[UIImage imageNamed:@"List.png"] tag:2]];

[viewControllers addObject:secondNavigationController];

UITabBarController *tabBarController = [[UITabBarController alloc] init];

[tabBarController setViewControllers:viewControllers];

[[self window] setRootViewController:tabBarController];

这很好。现在我有一个额外的导航要求,可以从secondViewController调用firstViewController,将数据传递给它。

我发现将数据传递给由标签栏访问的firstViewController的同一个实例的唯一方法如下(在secondViewController代码中):

firstViewController = [[[[[self tabBarController] viewControllers] objectAtIndex:0] viewControllers] objectAtIndex:0];

这很好用,但我发现它很乱,特别是如果我决定改变标签栏控制器中视图的顺序。

我还研究了标记方式,但似乎没有那么多改进代码。

还有另一种更干净的方式吗?

1 个答案:

答案 0 :(得分:0)

我不能声称通过将数据从一个视图控制器发送到另一个视频控制器来了解您要完成的任务,但如果发送数据是您的唯一目的,那么我建议使用Singleton Pattern。或者我会推荐NSNotificationCenter。单例可以保存可以从任何地方检索的app宽数据。你甚至可以(尽管它反对最佳实践)在单例类中保存对viewcontrollers的引用。我也大量使用通知来传递数据。只需发布通知并让其他课程听取它。

例如,在viewDidLoad中的firstViewController中,你可以这样做:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(theMethodToCall:) name:@"myNotificationName" object:nil];

然后在secondViewController中,当你想传递数据时你可以发布这个( “myData”是数据对象(如NSDictionary)):

[[NSNotificationCenter defaultCenter] postNotificationName:myNotificationName object:nil userInfo: myData];

然后在firstViewController中,此方法将接收数据。

-(void)theMethodToCall:(NSNotification *)notif
 {
      NSDictionary *dict = [notification userInfo];
 }

使用此代码,您还可以获得漂亮的对象引用