Подтвердить что ты не робот

UISplitViewController программно без nib/xib

Я обычно создаю свои проекты без IB-материалов. Первое, что я делаю, это снять все ссылки на xibs, обновить обновленные фиды и т.д. И т.д. Нет проблем, отлично работает (в моем мире)!

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

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

4b9b3361

Ответ 1

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

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

- (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];

РЕДАКТИРОВАТЬ - в соответствии с рекомендациями Скотта ниже, не добавляйте к окну subview, вместо этого

    [self.window setRootViewController:(UIViewController*)splitViewController];  // that 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; -)

Ответ 2

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

  • Убедитесь, что все подчиненные представления правильно реагируют shouldAutorotateToInterfaceOrientation. Здесь ничего нового.
  • Вместо добавления представления UISplitViewController в главное окно

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

    вместо этого установите корневой контроллер главного окна в UISplitViewController:

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

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

Ответ 3

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

вы можете изменить функцию в childViewController следующим образом:

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

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

Ответ 4

Версия Swift 5.0 (как контроллеры основного, так и подробного представления встроены в контроллеры навигации)

    let splitViewController =  UISplitViewController()
    splitViewController.delegate = self
    let masterVC = MasterViewController() 
    let detailVC = DetailViewController()
    let masterNavController = UINavigationController(rootViewController: masterVC)
    let detailNavController = UINavigationController(rootViewController: detailVC)
    splitViewController.viewControllers = [masterNavController,detailNavController]

Вы можете поместить этот код в функцию didFinishLaunchingWithOptions didFinishLaunchingWithOptions. Просто не забудьте сделать splitViewController вашим rootViewController следующим образом

    self.window!.rootViewController = splitViewController