Как переключаться между UITabBarController программно - PullRequest
0 голосов
/ 01 марта 2011

У меня есть приложение с UITabBarController, где первая вкладка содержит ViewController из HomePage.Что мне нужно сделать, это переключаться между вкладками (это довольно просто: [[self tabBarController] setSelectedIndex: index]), И для навигации по выходам выбранного Tab из "HomePage".

Просточтобы объяснить себя: TabElement1 ---> TabElementX ----> UISegmentedController: сегментY

Проблема в том, что UISegmentedController равен нулю, поскольку он еще не инициализирован (по крайней мере, в первый раз, когда я делаю операцию).Как мне решить эту проблему?Элементы вкладок загружаются с помощью перьев.

EDIT-- Вот некоторый код:

@implementation HomeViewController    // Tab Indexed 0
// ...
- (void)playVideoPreview {
NSArray *array;
array = [[self tabBarController] viewControllers];
    // This is a test where I programmatically select the tab AND the switch.
[[[array objectAtIndex:2] switches] setSelectedSegmentIndex:1];
[[self tabBarController] setViewControllers:array];
}
@end

@implementation TGWebViewController    // Tab Indexed 2
// ...
@synthesize switches;    // In .h file: @property (nonatomic, retain) IBOutlet UISegmentedControl switches; Properly linked within the XIB.
- (IBAction)switchHasChangedValue {
    // Foo operations.
}

Теперь, когда я в первый раз запускаю playVideoPreview, мне удается попасть во вкладку Indexed 2, TGWebViewController, нопереключателей еще не существует, поэтому я нахожусь с сегментированным элементом управления с именем «переключатели» с выбранным первым сегментом.Если я возвращаюсь в HomeViewController, то я снова запускаю playVideoPreview, я получаю правильное поведение.

1 Ответ

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

Я исправил проблему, используя делегаты и логическое значение. Теперь, когда загрузка ViewController по индексу 2 TabBar завершена, он отправляет сообщение своему делегату, в котором говорится, какой сегмент должен быть выбран.

РЕДАКТИРОВАТЬ Вот код (надеюсь, это поможет):

// Method in the first View that asks to tab the tab bar to launch the other
// view controller

- (void)playVideoPreview {
NSArray *array;

array = [[self tabBarController] viewControllers];
    if ( ![[array objectAtIndex:2] catSwitch] ) {
       [[array objectAtIndex:2] setDelegate:self];
       [[array objectAtIndex:2] setHasBeenLaunchedByDelegate:YES];
    } else {
       [self selectTab];
    }
    [[self tabBarController] setViewControllers:array];
    [[self tabBarController] setSelectedIndex:2];
}

// Now the operations performed by the second View Controller
- (void)somewhereInYourCode {
    if ( hasBeenLaunchedByDelegate ) {
        [[self delegate] selectTab];
    }
}

// In the First View Controller this is the delegate method, 
// launched from the Second View Controller
- (void)selectTab {
    NSArray *array;

array = [[self tabBarController] viewControllers];
    [[[array objectAtIndex:2] catSwitch] setSelectedSegmentIndex:[[bannerPreview pageControl] currentPage]];
}

// Some declaration
@protocol SecondViewControllerDelegate;
class SecondViewController : ViewController {
    id<TGWebViewControllerDelegate> delegate;
}
@end

@protocol SecondViewControllerDelegate 
    - (void)selectTab;
@end

// Meanwhile in the first view
class FirstViewController : ViewController <SecondViewControllerDelegate> {
// ...
}
...