У меня есть приложение, которое работает аналогичным образом. То, как я справляюсь с этим, состоит в том, чтобы абстрагировать это немного больше. То есть, пусть верхний уровень (ниже окна по умолчанию и прочего) будет только контроллером панели вкладок. Я бы предложил создать собственный класс, чтобы вы могли получить код. Затем поместите каждый контроллер панели навигации в пределах этой панели вкладок (в структуре пера), но беспокойтесь о добавлении их только тогда, когда они отображаются.
Использование Interface Builder: это было довольно просто сделать с IB. В моем файле MainWindow.xib на верхнем уровне есть все обычные вещи: Window, универсальный UITabBarController и UIViewController, которые я хочу вставить в каждый UINavigationController, мы скажем, что UIViewController 1b и 2b (1a и 2a - это два UIViewController, которые являются представлениями по умолчанию для каждой соответствующей панели навигации). Вложенный в UITabBarController, у меня есть UITabBar и два моих UINavigationController. В каждом из них у меня есть UINavigationBar, UIViewController и UITabBarItem, в этом порядке. Вот как выглядит мой код в делегате приложения:
[window addSubview:tabBarController.view];
[tabBarController setSelectedIndex:0];
Затем, когда я хочу использовать навигационные панели, я делаю это:
UIViewController* newView = [[UIViewController alloc]initWithNibName:@"newViewController" bundle:nil];
[self.navigationController pushViewController:newView animated:TRUE];
[newView release];
Это все, что мне нужно, чтобы заставить его работать (возможно, я забыл какую-то проводку IB).
Моя последняя мысль - это то, что связка может портить ваши навигационные панели. Я никогда не использовал его и не знаю много о плюсах и минусах, но вы можете попытаться убить его, чтобы посмотреть, исправит ли это хотя бы временно.