我有一个标签栏应用。在其中一个选项卡下,我想在顶部导航视图中使用uisegmentedControl,它控制当前显示的视图。如果我只是交换视图,这很容易,但我希望以更有条理和更通用的方式,通过为每个视图使用一个uiviewcontroller并以最优化的方式交换它们。
我想第一步就是确切地知道标签栏控制器在更改标签时发送给导航控制器/视图控制器的内容,然后从那里开始工作。
任何人都可以指出我正确的方向吗?
答案 0 :(得分:3)
前段时间我偶然发现SegmentsController
我在红色工匠的blog条目中找到了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];
。
我将它与UITabBarController结合使用,但不知道我做错了。没有错,因为“它崩溃”或“它没有做我想要的”,但错误的是我必须将每个UIViewController调用(如viewDidAppear,receivedMemoryWarning等)转发给子viewControllers。代码错误的应用程序仍在应用程序商店中,我从未收到任何抱怨。
但是我玩了一会儿,想出了如何正确使用它。这有点麻烦但是imho绝对值得。 我将向您展示我现在拥有的正确版本,我正在Interface Builder中创建UITabBarController,因此我必须更改代码中的选项卡。这引入了另一块混乱,也许还有改进的余地。但是现在我对这个解决方案感到满意。
{{1}}
正如你所看到它需要一些设置,但在我看来,这个解决方案比我在整个过程中尝试过的任何其他方案都要好。我希望我能正确地解密代码。
修改:上传了一个示例项目:BeautifulColors.zip
答案 1 :(得分:0)
只需交换视图并跟上当前视图的viewController就是在这方面实现UISegmentedControl的最佳方式。
注意:通过交换视图,我的意思是在当前视图中添加子视图并删除旧视图。
您可能对以下方法感兴趣,该方法由UITabBarControllerDelegate实现
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;