gpt4 book ai didi

ios - iOS8 上 Split View Controller 中的容器 View

转载 作者:行者123 更新时间:2023-11-29 02:29:58 25 4
gpt4 key购买 nike

我正在使用 xcode 6.1(最新版本),在 iPad 上运行,我的应用程序正在使用 UISplitViewContoller。master 和 detail 都嵌入了一个 UINavigationController(正如 Apple 在其文档中所建议的那样)。我的问题与 UISplitViewContoller 的主端有关。 UISplitVewController architecture with UINavigationController and UISegmentControl

master 有一个 UISegmentControl,它允许用户在 3 种 View 类型“current”、“shot”和“session”之间进行选择,从而改变 ma​​ster View 。我通过在主视图中嵌入一个容器 View 来实现这一点(并设置了正确的约束以将其调整为完整的主视图大小)。容器 View 是一个可以在 Storyboard中拖出的标准对象:

Container view can be dragged from storyboard

我已经创建了一个类 HixFieldViewControllerMaster 代表主人(在 Storyboard 中分配了该类)并连接了 Storyboard 中的段控件和容器:

HixFieldViewControllerMaster class connected in storyboard

HixFieldViewControllerMaster 派生 self 的类 HixViewControllerContainer(因此我可以为其他类重用容器 View 行为),其中包括函数 (void)loadViewWithClass: (类(class))我的类(class)

这个函数负责在容器 View 中加载实际的 View Controller

@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];
}

这在 iOS 7.x 上运行良好,但在 iOS8 上表现不正常;当用户使用段控件选择不同的 View 时,有时主窗口会变成空白,有时会显示 View 但未链接到代码(它只显示 Storyboard中绘制的内容但不执行底层代码)。

我确信 instantiateFromStoryBoard 逻辑工作正常(我没有从失败的 HixALog 函数中获取任何日志)。我相信我可能在 willMoveToParentViewControllerremoveFromSuperview 或其他 View Controller 管理方面做错了......

最佳答案

对于阅读本文的任何人,我从未找到解决方案。最后,我删除了段控件(屏幕顶部)并使用选项卡控件(屏幕底部)。

关于ios - iOS8 上 Split View Controller 中的容器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com