Как добавить 2 ViewControllers в одно окно - PullRequest
1 голос
/ 27 июня 2010

Я слежу за курсом по разработке iPhone в Стэнфорде в iTunes U, и у меня возникли проблемы с одним из их заданий (папарацци, если кто-то знаком).

Что я пытаюсь сделать, так это создать этот первый экран после запуска приложения:

http://cl.ly/1USw/content

И вот код, который у меня есть в делегате приложения:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // PersonListViewController is the 'content' of the screen (image, name, and button)
 PersonListViewController* personList = [[PersonListViewController alloc] initWithNibName:@"PersonListViewController" bundle:[NSBundle mainBundle]];
 navController = [[UINavigationController alloc] initWithRootViewController:personList];
 [personList release];

 UITabBarController* tabBarController = [[UITabBarController alloc] init];
 [window addSubview:[tabBarController view]];
 [window addSubview:[navController view]];
    [window makeKeyAndVisible];

 return YES;
}

Но этот код, похоже, не отображает панель вкладок внизу, только панель навигации и вид посередине (изображение, имя и кнопка).

Может кто-нибудь объяснить мне, что я сделал не так и как это исправить?

Ответы [ 2 ]

3 голосов
/ 27 июня 2010

Обычно вы вкладываете свой основной ViewController (в данном случае PersonListViewController) в UINavigationController (как вы это сделали), но затем вы устанавливаете свойство tabBarController.viewControllers равным массиву контроллеров представления (по одному на каждую вкладку).

В вашем случае это будет выглядеть как

tabBarController.viewControllers = [NSArray arrayWithObject:navController];

Затем добавьте в окно только представление tabBarController

[window addSubview:[tabBarController view];

Это дастваш список, внутри контроллера навигации, внутри контроллера вкладок (и на данный момент у контроллера вкладок будет только одна вкладка).

2 голосов
/ 27 июня 2010

UIWindow не справляется, если вы пытаетесь поместить в него представления двух контроллеров представления: только последний получит соответствующие обратные вызовы, и они не будут знать друг о друге. (Я сделал это намеренно, когда мне нужен постоянный анимированный фон за прозрачным набором представлений, но это сложно.) В ios4 это более явно: UIWindow имеет свойство rootViewController, которое содержит ВК для окна.

Здесь вам нужен контроллер панели вкладок , содержащий контроллеров навигации, по одному на вкладку, каждый из которых содержит один из ваших пользовательских VC.

вроде как: (это без манжеты и не проверено, так что следите за ошибками)

PersonListViewController* plvc = [[[PersonListViewController alloc]
                                    initWithNibName:@"PersonListViewController"
                                             bundle:nil]
                                    autorelease];

UINavigationController *uinc = [[[UINavigationController alloc]
                                  initWithRootViewController:plvc]
                                  autorelease];
// ... make more VCs for any other tab pages here

UITabBarController* tbc = [[[UITabBarController alloc] init] autorelease];

[tbc setViewControllers:[NSArray arrayWithObjects: uinc, nil]]; // *1

/* iOS 4 and later, preferred: */
[window setRootViewController:tbc];

/* or, alternatively, in iOS 3:
[window addSubview:[tbc view]];
[self setMyMainTabsController:tbc]; // must keep an owning reference or it'll get released
*/

[window makeKeyAndVisible];

в * 1, добавьте любые VC для других вкладок в список.

Размещение контроллеров навигации внутри контроллера вкладок вполне законно и одобрено Apple. Помещать контроллеры вкладок в навигационные контроллеры нельзя, хотя это может работать в ограниченных случаях.

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