Я использую xcode 6.1 (последняя версия), работающий на iPad, и мое приложение использует UISplitViewContoller
. Мастер и деталь встраиваются в UINavigationController
(как сообщается Apple в их документах). Моя проблема связана с главной стороной UISplitViewContoller
. Container View внутри контроллера разделенного вида на iOS8
Мастера имеет UISegmentControl
, который позволяет пользователю выбирать между 3 типов зрения «текущий», «выстрелом» и «сеансом», которые изменяют мастера вида. Я реализовал это, вставив представление контейнера в мастер (и установил правильные ограничения для его размера до полного размера главного представления). Контейнер просмотра стандартный объект, который может быть перетаскивается в раскадровке:
Я создал класс HixFieldViewControllerMaster
, который представляет мастер (назначенный класс в раскадровке) и подключен контроль сегмента и контейнер в раскадровке :
HixFieldViewControllerMaster
происходит из моего класса HixViewControllerContainer
(так что я могу повторно использовать поведение вида контейнера для других классов), который включает в себя функцию (void)loadViewWithClass:(Class) myClass
Эта функция заботится о загрузке фактического контроллер представления в представлении контейнера
@interface HixViewControllerContainer()
@property (weak, nonatomic) UIView * containerView;
@property (strong, nonatomic) NSString * currentStoryBoardID;
@end
@implementation HixViewControllerContainer
#pragma mark - helper functions
-(void)loadViewWithClass:(Class)myClass
{
//if the class does not implement the required function assert (in debug)
if(![myClass respondsToSelector:@selector(instantiateFromStoryboard:)])
{
HixALog(@"%@ does not implement instantiateFromStoryboard",myClass);
return;
}
//if already loaded do nothing...
if([self.containerView class] == myClass) return;
//Remove the current Detail View Controller showed
if(self.currentContainerViewController)
{
[self.currentContainerViewController willMoveToParentViewController:nil];
[self.currentContainerViewController.view removeFromSuperview];
[self.currentContainerViewController removeFromParentViewController];
}
//create new vc
UIViewController * newVC=[myClass instantiateFromStoryboard:self.storyboard];
//set correct auto resize behaviour
newVC.view.translatesAutoresizingMaskIntoConstraints = NO;
//Add the detail controller as child of the container
[self addChildViewController:newVC];
//define the detail controller's view size
newVC.view.frame = self.containerView.frame;
//add the Detail controller's view to the Container's detail view and save a reference to the detail View Controller
[self.containerView addSubview:newVC.view];
UIView *myView=newVC.view;
//set correct constraits so resizing is ok
[self.containerView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-0-[myView]-0-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.containerView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-0-[myView]-0-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
//store new vc as the current one
self.currentContainerViewController = newVC;
//complete the add flow calling the function didMoveToParentViewController
[newVC didMoveToParentViewController:self];
}
Это работает нормально КСН 7.x, но ведет себя хаотично на iOS8; когда пользователь выбирает различные представления с помощью элемента управления сегментами, иногда мастер-окна становятся пустыми, иногда он показывает представление, но не связан с кодом (он просто отображает материал, нарисованный в раскадровке, но никакого базового кода не выполняется).
Я уверен, что логика instantiateFromStoryBoard
работает правильно (я не получаю ни одного журнала из функции HixALog, с которой она не удалась). Я считаю, что я, вероятно, что-то не так с willMoveToParentViewController
, removeFromSuperview
... или другим домашним хозяйством viewcontroller ...