UISplitViewController программно без пера / xib - PullRequest
47 голосов
/ 03 мая 2010

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

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

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

Ответы [ 4 ]

58 голосов
/ 05 июня 2010

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

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

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

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

    [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; -)

23 голосов
/ 17 января 2012

Старый поток, но я подумал, что смогу сэкономить время читателя + горе, когда вышеупомянутая методика не может создать 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 - это представление горца; может быть только один .

4 голосов
/ 15 февраля 2012

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

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

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

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

1 голос
/ 03 мая 2019

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 вашего AppDelegate. Просто не забудьте сделать splitViewController ваш rootViewController таким, как этот

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