2010-05-03 8 views
43

Обычно я создаю свои проекты без IB-файлов. Первое, что я делаю, это снять все ссылки на xibs, обновить обновленные фиды и т. Д. И т. Д. Нет проблем, отлично работает (в моем мире)!UISplitViewController программно без nib/xib

Теперь я только что установил 3.2 и попытался разработать свое первое приложение для iPad. Следуя той же процедуре, что и раньше, я создал проект приложения на основе UISplitView и удалил все элементы IB. Кроме того, я следил за разделом в справочных документах Apple: Creating a Split View Controller Programmatically, но, тем не менее, мастер-просмотр никогда не отображается, только подробный вид (независимо от ориентации). Я действительно старался внимательно изучить это, но я не могу понять, что я пропустил.

Есть ли рабочий пример UISplitViewController без плавающих вокруг где-нибудь плюшек? У меня есть googled, но я не мог найти. Или вы знаете, что я, возможно, пропустил?

+8

«Обычно я создаю свои проекты без IB-материала». <- +1 для этого. Вот как работает программирование, я тоже это делаю. Ты жжешь! – 2012-10-28 05:54:48

ответ

55

Объявить свой splitviewcontroller в заголовке вашего делегата, использовать что-то вроде этого в вашем didfinishlaunching

убедитесь, что вы добавить UISplitViewControllerDelegate в файл заголовка detailedViewController и что у вас есть методы делегата, а также. не забудьте импортировать соответствующие файлы заголовков

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

    splitViewController = [[UISplitViewController alloc] init]; 

    rootViewController *root = [[rootViewController alloc] init]; 
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root]; 

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail]; 

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil]; 
    splitViewController.delegate = detail; 

    [window addSubview:splitViewController.view]; 

EDIT - в соответствии с отличным предложением Скотта ниже, не добавляйте в подвид окна, вместо

[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    [window makeKeyAndVisible]; 
    return YES; 
} 


//detailedView delegate methods 
- (void)splitViewController:(UISplitViewController*)svc 
    willHideViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem*)barButtonItem 
     forPopoverController:(UIPopoverController*)pc 
{ 
    [barButtonItem setTitle:@"your title"]; 



    self.navigationItem.leftBarButtonItem = barButtonItem; 
} 


- (void)splitViewController:(UISplitViewController*)svc 
    willShowViewController:(UIViewController *)aViewController 
    invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    self.navigationItem.leftBarButtonItem = nil; 
} 

Я также предпочитаю код IB ;-)

+5

Этот ответ именно то, что я искал. Один вопрос: в справочном примере кода Apple (http://developer.apple.com/library/ios/ipad/#samplecode/MultipleDetailViews/Listings/Classes_RootViewController_m.html) они обрабатывают делегат UiSplitviewcontroller в контроллере корневого представления. Вместо этого вы обрабатываете его в подробном контроллере. Есть ли причина для того или иного пути? –

+0

Контроллер, который становится делегатом, зависит от вас. Если вы чувствуете, что 'detailViewController' собирается * команду *' rootViewController', который полностью прекрасен :). Хотя в этом случае вы, вероятно, захотите переименовать переменные в соответствие с вашим дизайном (например, 'listViewController' и' mainViewController' для 'rootViewController' и' detailViewController' соответственно) – nacho4d

22

Одинокая нить, но я подумал, что я избавил бы от читателя время + печаль, когда вышеупомянутый метод не сможет создать UISplitViewController, который правильно реагирует на события изменения ориентации устройства. Вам нужно:

  1. Убедитесь, что все подчиненные виды должным образом реагировать на shouldAutorotateToInterfaceOrientation. Здесь ничего нового.
  2. Вместо того, чтобы добавить мнение UISplitViewController к главному окну,

    [window addSubview:splitViewController.view]; // don't do this 
    

    вместо того, чтобы установить корневой контроллер главного окна к UISplitViewController:

    [self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    

Добавления мнения splitviewcontroller в качестве подвида основного окна (едва) позволяет ему совместно присутствовать со взглядами братьев и сестер, но он не летает с предполагаемым прецедентом использования UISplitViewController. UISplitViewController - это вид горцев; может быть только.

3

Я только что встретил ту же проблему. убедитесь, что ваш child viewController splitview может авторизовать ориентацию интерфейса.

вы можете изменить функцию в childViewController так:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

тогда мастер представление будет показано.

+1

Я люблю тебя! Моя проблема решена! – mineschan

Смежные вопросы