可以通过界面编辑器轻松地将容器视图添加到故事板中.添加时,Container View具有占位符视图,嵌入segue和(子)视图控制器.
但是,我无法找到以编程方式添加Container View的方法.实际上,我甚至找不到一个名为UIContainerView
左右的班级.
Container View类的名称肯定是一个好的开始.我们非常感谢包括segue在内的完整指南.
我知道View Controller Programming Guide,但我不认为它与Interface Builder为Container Viewer的方式相同.例如,正确设置约束后,(子)视图将适应容器视图中的大小更改.
我想添加一个tableViewController作为containerViewController的子视图控制器(如下所示).根据Apple的View Controller Programming Guide,我可以通过我的containerViewController中的以下代码行实现这一点:
[self addChildViewController:tableViewController];
[self.view addSubview:tableViewController.view];
[tableViewController didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
事实上,这很好.现在的问题是我不想将tableViewController的视图添加为containerViewController的根视图的子视图.相反,我想将它添加为containerView的子视图(参见图像),它本身是containerViewController的根视图的子视图.所以我改变了上面的代码如下:
[self addChildViewController:tableViewController];
[self.contentView addSubview:tableViewController.view];
[tableViewController didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
现在,当我启动应用程序时,它立即崩溃并出现此错误:
由于未捕获的异常'UIViewControllerHierarchyInconsistency'而终止应用程序,原因:'子视图控制器:应该有父视图控制器:但实际的父级是:'
这里有什么问题?是不是可以将childViewController的视图添加到其containerViewController 的特定子视图中?或者如何在视图控制器层次结构中没有错误的情况下实现此目的?
parentviewcontroller addsubview ios childviewcontroller container-view
我想做什么:
由父视图控制器管理的父视图不应该旋转.
由子视图控制器管理的子视图应该旋转到所有方向.
我试过的:
ParentViewController
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Portrait
}
override func shouldAutorotate() -> Bool {
return true
}
fun addChildViewController() {
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
self.childViewController = storyBoard("Child View Controller") as? ChildViewController
self .addChildViewController(self.childViewController!)
self.childViewController! .didMoveToParentViewController(self)
self.view .addSubview(self.childViewController!.view)
self.childViewController!.view.frame = CGRectMake (40, 200, 400, 250)
}
Run Code Online (Sandbox Code Playgroud)
ChildViewController
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .All
}
override func shouldAutorotate() -> Bool {
return true
}
Run Code Online (Sandbox Code Playgroud)
Xcode部署信息中支持的方向设置为全部四个.
我得到了什么:
没有View的旋转.如果我将父级的旋转设置为all,则所有视图一起旋转.所以它是全有或全无. …
xcode uiviewcontroller landscape-portrait childviewcontroller swift
我正在尝试使用此代码将子视图控制器添加到a中的UIViewController
包含UINavigationController
:
- (void)buttonTapped:(id)sender
{
MyChildController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyChild"];
[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
viewController.view.alpha = 0.0f;
[UIView animateWithDuration:0.4 animations:^{
viewController.view.alpha = 1.0f;
}];
}
Run Code Online (Sandbox Code Playgroud)
但这是结果:
正如您所看到的那样UINavigatioBar
,UIToolbar
它们仍位于子视图控制器的顶部.如何将子视图控制器置于最重要的位置?我已经尝试用以下代码替换代码:
[self.navigationController addChildViewController:viewController];
[self.navigationController.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self.navigationController];
Run Code Online (Sandbox Code Playgroud)
但是,在这种方式viewDidAppear:animated
的viewController
不会被调用,不知道为什么.
iphone objective-c uiviewcontroller childviewcontroller ios7
我在我的主故事板中创建并绘制了一个名为AutocompleteVC的自定义UIViewController.AutocompleteVC将用于几个不同的地方/故事板,并具有不同的尺寸.
例如,在我的Transit故事板中,如下所示,有一个名为TransitVC的自定义UIViewController,如左图所示.在TransitVC中,我有一个带有名为autocompleteContainerView的IBOutlet的容器视图.autocompleteContainerView有一个名为autocompleteEmbedSegue的segue到一个通用的UIViewController,右边显示为红色.
目标是让TransitVC在autocompleteContainerView中保存AutocompleteVC.但我无法让这个工作.我想在容器视图中执行此操作的原因是我可以使用autolayout来设置它的约束.否则,我知道如何在代码中完全执行此操作.
我相信我的方法可能存在缺陷.如果我想最大限度地利用故事板,那么正确的方法是什么?
containers interface-builder storyboard ios childviewcontroller
我正在使用这个SO答案提供的技术在SFSafariViewController中预加载一些URL,如下所示:
addChildViewController(svc)
svc.didMoveToParentViewController(self)
view.addSubview(svc.view)
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下代码删除Safari View控制器:
svc.willMoveToParentViewController(nil)
svc.view.removeFromSuperview()
svc.removeFromParentViewController()
Run Code Online (Sandbox Code Playgroud)
现在我可以预加载URL并毫无问题地显示Safari视图.但是,在我重复该过程(预加载/显示/删除)几次(可能超过30次)后,应用程序将因某些内存问题而崩溃,因为日志显示Memory level is not normal or this app was killed by jetsam
应用程序崩溃的时间.
在崩溃之前,我看到了一些关于可能泄漏警告的日志:
<Warning>: notify name "UIKeyboardSpringBoardKeyboardShow" has been registered 20 times - this may be a leak
<Warning>: notify name "com.apple.SafariViewService-com.apple.uikit.viewService.connectionRequest" has been registered 20 times - this may be a leak
Run Code Online (Sandbox Code Playgroud)
我在删除Safari View控制器时是否正确执行此操作?我错过了什么吗?或任何解决此问题的建议?
我一直在尝试添加视图容器,从侧面留出20px的空间.但似乎不是这样做的正确方法......
// ADD CHILD VIEW CONTROLLER
[parentViewController addChildViewController:childViewController];
[parentViewController.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:parentViewController];
// REMOVE THE CHILD VIEW CONTROLLER
[childViewController willMoveToParentViewController:nil];
[childViewController view] removeFromSuperview];
[childViewController removeFromParentViewController];
Run Code Online (Sandbox Code Playgroud)
更新 我已经通过使用这个MZFormSheetController" https://github.com/m1entus/MZFormSheetController "表单演示与酷视图转换找到了它.
我正在向父视图控制器添加子视图控制器,并且一切都按预期工作,除了子视图控制器没有触发其通常的回调.例如,从未调用像viewWillAppear(动画)这样的东西.我调查了一下,并认为这可能是因为我没有在子视图控制器上分别将它添加到父视图之前和之后调用willMoveToParentViewController和didMoveToParentViewController.不幸的是,修复没有任何区别.有没有人知道如何连接它,以便当我执行addChildViewController和removeChildViewController时,会触发常规回调?添加childViewController后,我还将其视图作为子视图添加到父视图控制器的视图中.在任何一点(addChildViewController和addSubview)都会调用子视图控制器的viewWillAppear(动画)等方法...
缺口
假设我有一个自定义容器视图控制器(MainViewController),我在这里执行以下操作:
- (void)viewDidLoad
{
[super viewDidLoad];
HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
[self addChildViewController:homeVC];
[self.view addSubview:homeVC.view];
}
Run Code Online (Sandbox Code Playgroud)
HomeViewController将有一个按钮,例如"go",按下时需要前进到下一个视图控制器.所以我需要通知MainViewController这个动作.做这个的最好方式是什么?
我正在使用自定义容器,因为我需要在视图控制器之间进行自定义转换.当按下"go"时,HomeViewController上的一些视图将动画,而新视图控制器的视图将动画到位.
显然,我可以给HomeViewController一个MainViewController类型的属性,并以这种方式进行调用,但我希望有一个更简洁的方法与容器视图控制器API.
uiviewcontroller parentviewcontroller ios childviewcontroller
如何将子视图控制器的视图添加到自定义UITableViewCell
?我可以在里面添加这样的视图cellForRowAtIndexPath
:
self.addChildViewController(controlsViewController)
cell!.cellView.addSubview(controlsViewController.view)
controlsViewController.didMoveToParentViewController(self)
Run Code Online (Sandbox Code Playgroud)
但是当单元格消失时,我需要删除这个子视图控制器.我真的不确定该怎么做.有没有更好的方法来解决这个问题?
ios ×8
swift ×3
ios7 ×2
iphone ×2
addsubview ×1
cocoa-touch ×1
containers ×1
objective-c ×1
storyboard ×1
subview ×1
uitableview ×1
xcode ×1