Реализация моего собственного контроллера навигации? - PullRequest
0 голосов
/ 07 марта 2011

У меня есть приложение панели вкладок.Под одной из вкладок я хочу uisegmentedControl в верхнем навигационном представлении, которое управляет тем, какое представление отображается в данный момент.Это очень просто, если я просто обмениваюсь представлением, но я хочу сделать это более организованным и общим способом, используя один контроллер uiview для каждого представления и обменивая их наиболее оптимизированным способом.

я думаю, шагможно было бы точно знать, что контроллер табуляции отправляет контроллеру навигации / контроллеру представления при смене вкладки, и отрабатывать ее оттуда.

Может ли кто-нибудь направить меня в правильном направлении?

Ответы [ 2 ]

3 голосов
/ 07 марта 2011

Некоторое время назад я наткнулся на 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

0 голосов
/ 07 марта 2011

Простой обмен представлениями и поддержание текущего представления viewController - лучший способ реализовать UISegmentedControl в этом отношении.

Примечание. Обмениваясь представлениями, я имею в виду добавление подпредставления к текущему представлению и удаление старого.

Возможно, вас заинтересует приведенный ниже метод, который реализуется UITabBarControllerDelegate

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...