2014-11-20 2 views
0

Я использую xcode 6.1 (последняя версия), работающий на iPad, и мое приложение использует UISplitViewContoller. Мастер и деталь встраиваются в UINavigationController (как сообщается Apple в их документах). Моя проблема связана с главной стороной UISplitViewContoller. UISplitVewController architecture with UINavigationController and UISegmentControlContainer View внутри контроллера разделенного вида на iOS8

Мастера имеет UISegmentControl, который позволяет пользователю выбирать между 3 типов зрения «текущий», «выстрелом» и «сеансом», которые изменяют мастера вида. Я реализовал это, вставив представление контейнера в мастер (и установил правильные ограничения для его размера до полного размера главного представления). Контейнер просмотра стандартный объект, который может быть перетаскивается в раскадровке:

Container view can be dragged from storyboard

Я создал класс HixFieldViewControllerMaster, который представляет мастер (назначенный класс в раскадровке) и подключен контроль сегмента и контейнер в раскадровке :

HixFieldViewControllerMaster class connected in storyboard

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 ...

ответ

1

Для всех, кто читает это, я так и не нашел решения для этого. В конце концов, я удалил элемент управления сегмента (сверху экрана) и работал с элементом управления вкладкой (внизу экрана).

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