2011-03-07 85 views
0

我有一个标签栏应用程序。在其中一个选项卡中,我想在顶部导航视图中使用uisegmentedControl,它控制当前显示的视图。如果我只是交换视图,这很容易,但我想以更有组织和通用的方式进行操作,对每个视图使用一个uiviewcontroller并以最优化的方式交换它们。实现我自己的导航控制器?

我想第一步就是要知道tabbar控制器在更改选项卡时发送给导航控制器/视图控制器的确切内容,然后从中解决问题。

任何一个人都可以指向正确的方向吗?

回答

3

前段时间我偶然发现了SegmentsController我在从红色工匠这个blog条目中找到实施。
我与UITabBarController一起使用它,但不知道我做错了。没有错,因为它“崩溃”或“它没有做我想做的事”,但错误的是我必须将每个UIViewController调用(如viewDidAppear,receivedMemoryWarning等)转发给子viewControllers。带有错误代码的应用程序仍在应用程序商店中,我从未收到过抱怨。

但我玩了一段时间,并想出如何正确使用它。这有点麻烦,但恕我直言,这绝对是值得的。 我会告诉你我现在有正确的版本,我在Interface Builder中创建UITabBarController,所以我必须更改代码中的选项卡。这引出了另一块混乱,也许还有改进的余地。但是现在我对这个解决方案很满意。

NSMutableArray *items = [self.tabBarController.viewControllers mutableCopy]; // tabs from tabbar configured in IB 

// The two child vc that will appear in the segment control 
SomeViewController_iPhone *tvcs = [[[SomeViewController_iPhone alloc] initWithNibName:@"SomeView_iPhone" bundle:nil] autorelease]; 
SomeOtherViewController_iPhone *tvct = [[[SomeOtherViewController_iPhone alloc] initWithNibName:@"SomeOtherView_iPhone" bundle:nil] autorelease]; 
NSArray *viewControllers1 = [NSArray arrayWithObjects:tvcs, tvct, nil]; 

// the nav controller acts as a wrapper around the child viewcontrollers 
UINavigationController *navController1 = [[[UINavigationController alloc] init] autorelease]; 
navController1.tabBarItem.title = NSLocalizedString(@"FirstTab", nil); 
navController1.tabBarItem.image = [UIImage imageNamed:@"tabImage1.png"]; 
navController1.navigationBar.tintColor = [UIColor navBarTintColor]; 

firstTabSegmentsController = [[SegmentsController alloc] initWithNavigationController:navController1 viewControllers:viewControllers1]; 

// uses a NSArray category that basically creates a NSArray that has the title properties of the vc in viewControllers1 
firstTabSegmentedController = [[UISegmentedControl alloc] initWithItems:[viewControllers1 arrayByPerformingSelector:@selector(title)]]; 
firstTabSegmentedController.frame = CGRectMake(0, 0, 222, 30); 
firstTabSegmentedController.segmentedControlStyle = UISegmentedControlStyleBar; 
firstTabSegmentedController.selectedSegmentIndex = 0; 

[firstTabSegmentsController indexDidChangeForSegmentedControl:firstTabSegmentedController]; 

[firstTabSegmentedController addTarget:firstTabSegmentsController action:@selector(indexDidChangeForSegmentedControl:) forControlEvents:UIControlEventValueChanged]; 

// replace first tab from interface builder with this 
[items replaceObjectAtIndex:0 withObject:navController1]; 

当你看到它需要一些设置,但在我看来,这个解决方案是比什么都重要,我在整个时间尝试更好。我希望我能够正确地删除代码。


编辑:上传的样本项目:BeautifulColors.zip

+0

嗨, 非常感谢!我希望今晚有时间来尝试一下。 你有没有一个可以发送邮件或上传的示例项目? 亲切的问候 E – Erik 2011-03-08 02:41:26

+0

@Erik只做了一个。请参阅编辑。 – 2011-03-08 09:52:37

+0

完美,我需要的一切! – Erik 2011-03-08 10:32:11

0

只是交换视图并跟上当前视图的viewController是在这方面实现UISegmentedControl的最佳方式。

注意:通过交换意见我的意思是添加一个子视图到当前视图和删除旧的。

你可能有兴趣在下面的方法,它是由UITabBarControllerDelegate

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;