UITabBarController - как сделать так, чтобы при запуске не выделялось ни одной вкладки? - PullRequest
3 голосов
/ 17 октября 2010

Можно ли в iPhone отменить выбор всех вкладок UITabBarController? то есть мое приложение имеет "домашнюю страницу", которая не принадлежит ни одной вкладке на отображаемой ниже панели вкладок. Теперь, когда пользователь касается любой вкладки на панели вкладок, я хотел бы загрузить соответствующую вкладку. Это возможно ? Я уже попробовал:

self.tabBarController.tabBarItem.enabled = NO; self.tabBarController.selectedIndex = -1;

но это не помогает. Любые другие решения? Пожалуйста?

Ответы [ 2 ]

7 голосов
/ 27 ноября 2010

Мне удалось сделать это, используя КВО трюки.

Идея проста: мы отслеживаем, когда UITabBarController пытается установить свое свойство selectedViewController, и немедленно возвращаем его значение равным nil.

Пример кода:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Create the view controller which will be displayed after application startup
    mHomeViewController = [[HomeViewController alloc] initWithNibName:nil bundle:nil];

    [tabBarController.view addSubview:mHomeViewController.view];
    tabBarController.delegate = self;
    [tabBarController addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:NULL];

    // further initialization ...
}

// This method detects if user taps on one of the tabs and removes our "Home" view controller from the screen.
- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if (!mAllowSelectTab)
    {
        [mHomeViewController.view removeFromSuperview];
        mAllowSelectTab = YES;
    }

    return YES;
}

// Here we detect if UITabBarController wants to select one of the tabs and set back to unselected.
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (!mAllowSelectTab)
    {
        if (object == tabBarController && [keyPath isEqualToString:@"selectedViewController"])
        {
            NSNumber *changeKind = [change objectForKey:NSKeyValueChangeKindKey];

            if ([changeKind intValue] == NSKeyValueChangeSetting)
            {
                NSObject *newValue = [change objectForKey:NSKeyValueChangeNewKey];

                if ([newValue class] != [NSNull class])
                {
                    tabBarController.selectedViewController = nil;
                }
            }
        }
    }
}

Однако, одно небольшое замечание: первый контроллер представления из панели вкладок все равно будет загружен (хотя и в течение очень короткого времени), поэтому его viewDidLoad и viewWillAppear будут вызываться после запуска. Возможно, вы захотите добавить некоторую логику, чтобы предотвратить некоторые инициализации, которые вы, вероятно, можете выполнять в этих функциях до «реального» отображения этого контроллера в результате нажатия пользователем (например, с использованием глобальных переменных или NSNotificationCenter).

0 голосов
/ 17 октября 2010

Отображение панели вкладок без выбранной вкладки нарушит работу пользователя.На панели вкладок всегда должен быть выбран один элемент и показана соответствующая страница - все остальное сбивает с толку.

Так что если вам нужно показать что-то еще, вы должны сделать это поповером (то есть скользящим листом снизу)это может быть отклонено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...