Я пытаюсь добавить контроллер навигации внутри контроллера панели вкладок в совершенно новом стиле без раскадровки (простой старый перо).
Я нашел это демо, в котором предполагается, что XCode имеет новый шаблон проекта под названием "Приложение панели вкладок". Это не так. Теперь в XCode 4.6 есть «Новое приложение с вкладками». Конечно, Apple в своей великой мудрости решила, что у меня не должно быть nib главного окна (.xib), а контроллер панели вкладок и его страницы должны быть закодированы для меня в делегате приложения, а не в новом удобном для пользователя NIB. экземпляр контроллера вкладок. Я предполагаю, что это потому, что это более гибко, и вы можете написать код, чтобы решить, какие вкладки видит пользователь, а какие нет. Если я включу раскадровки, то, думаю, я все равно смогу делать все визуально.
Меня глубоко смущает длинная и мучительная история различий версий XCode, которые влияют на действительность существующих вопросов о stackoverflow и демонстрациях в других местах в Интернете, которые ссылаются на разные версии iOS и разные версии XCode и делают предположения, характерные для версий XCode. и iOS, которые теперь, похоже, изменились, и каждый из которых опирается на разные варианты выбора содержимого вашего Main Nib File Base Name
, установленного или не установленного.
Я также считаю, что первичным мотивом для создания раскадровок было предварительное раскадровочное перо и сложность объединения различных виджетов и контроллеров UIKit.
Я работаю в реальном приложении на основе пера без раскадровки, которое, по-видимому, было создано до этого изменения взглядов на Apple, и я вижу, что при запуске множество ненужных представлений создаются автоматически путем создания экземпляра пера, а затем удаляются, для динамического скрытия и отображения вкладок на контроллере панели вкладок. Кажется, об этом много думали в Apple, и они неявно изменили рекомендуемые методы, изменив способ создания новых приложений в XCode. Я не ставлю под сомнение их мудрость, на самом деле я ценю перемены, но они оставили меня потерянным и сбитым с толку.
В любом случае, я просто пытаюсь поместить навигационный контроллер во вкладку на главной панели вкладок, и у меня уже есть приложение, которое, должно быть, было запущено, когда XCode использовался для создания главного окна и создания «Приложения панели вкладок» с помощью представление верхнего уровня, которое представляет собой представление с вкладками, а контроллер панели вкладок создается экземпляром пера. Демонстрация выше предполагает именно это.
Apple, как известно, никогда не демонстрировала эту очевидную комбинацию панели вкладок и навигационного контроллера. Или мне так сказали. И в Руководстве по человеческому интерфейсу Apple, по-видимому, говорится (или используется для утверждения?), что лучше поместить навигационный контроллер внутри панели вкладок, чем наоборот, и мой вопрос следует понимать как желание соответствовать HIG, насколько это возможно, поэтому я считаю Я спрашиваю о рекомендуемой комбинации, а не о нерекомендуемой комбинации.
Вот что я пробовал до сих пор:
Пытался следовать эта запись в блоге примерно 2009 года, в которой предполагается, что в более старых версиях XCode верно то, что уже не соответствует действительности.
Начиная с нового приложения с вкладками, которое XCode сгенерировал для меня, с отключенными раскадровками, у меня есть корневой файл делегата приложения .m, который он сгенерировал для меня, который, по-видимому, создает во время запуска приложения панель вкладок. Объект контроллера полностью в коде и не имеет пера главного окна. Следующий код полностью написан Apple, и мне интересно, где (как относительно новый разработчик Cocoa) я должен взломать это и разместить свои новые материалы, если я хочу изменить одну из вкладок, чтобы иметь панель навигации и связанный с ним UINavigationViewController:
-- Этот маркер помогает не спутать систему уценки stackoverflow --
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UIViewController *viewController1, *viewController2;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
viewController1 = [[RPDAFirstViewController alloc] initWithNibName:@"RPDAFirstViewController_iPhone" bundle:nil];
viewController2 = [[RPDASecondViewController alloc] initWithNibName:@"RPDASecondViewController_iPhone" bundle:nil];
} else {
viewController1 = [[RPDAFirstViewController alloc] initWithNibName:@"RPDAFirstViewController_iPad" bundle:nil];
viewController2 = [[RPDASecondViewController alloc] initWithNibName:@"RPDASecondViewController_iPad" bundle:nil];
}
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = @[viewController1, viewController2];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Теперь кажется, что то, что раньше было возможно без написания кода (согласно тому примеру 2009 года в блоге, на который я ссылался), теперь делается исключительно в коде. Я прочитал около 500 страниц «Программирование iOS 5», несколько сотен часов работал над своим первым приложением и пробовал множество демо-приложений, но я все еще относительно неопытный разработчик Cocoa/iOS, и я считаю, что часть моих путаницу во всем этом вызывает паттерн «контроллер и представление», и его правила их совмещения, как в коде, так и в nibs, мне не совсем понятны.
--
Обновление: у вас есть кодез! В интересах помощи будущим новичкам XCode-cocoa-iOS, таким как я, я сделал полное демонстрационное приложение и опубликовал его. на github здесь.
Скриншот: