UISplitViewController программно без nib/xib
Я обычно создаю свои проекты без IB-материалов. Первое, что я делаю, это снять все ссылки на xibs, обновить обновленные фиды и т.д. И т.д. Нет проблем, отлично работает (в моем мире)!
Теперь я просто установил 3.2 и попытался разработать первое приложение для iPad. Следуя той же процедуре, что и раньше, я создал проект приложения на основе UISplitView и удалил все элементы IB. Кроме того, я следил за разделом в справочных документах Apple: Создание контроллера с разделенным просмотром программно, но тем не менее, мастер-просмотр никогда не отображается, только Детальный вид (независимо от ориентации). Я действительно старался внимательно изучить это, но я не могу понять, что я пропустил.
Есть ли рабочий пример UISplitViewController без плавающих вокруг где-нибудь плюшек? У меня есть googled, но я не мог найти. Или вы знаете, что я, возможно, пропустил?
Ответы
Ответ 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