Некоторое время назад я наткнулся на SegmentsController
, который я нашел в этом блоге записи от красного ремесленника.
Я использовал его вместе с UITabBarController, но не зная, что сделал это неправильно. Не так, как в «он падает» или «он не делает то, что я хочу», но неправильно в том смысле, что я должен перенаправлять каждый вызов UIViewController (например, viewDidAppear, receiveMemoryWarning и т. Д.) Дочернему viewControllers. Приложение с неправильным кодом все еще находится в магазине приложений, и я никогда не получал жалоб на него.
Но я немного поиграл и понял, как правильно его использовать. Это немного хлопотно, но имхо, оно того стоит.
Я покажу вам правильную версию, которая у меня есть сейчас, я создаю 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];
как видите, нужно немного настроить, но, на мой взгляд, это решение лучше, чем все, что я пробовал за все время. Надеюсь, я де-NDA код правильно.
Редактировать: загружен пример проекта: BeautifulColors.zip