Мне удалось сделать это, используя КВО трюки.
Идея проста: мы отслеживаем, когда 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).