Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIFT:无法单击子视图_Swift_Uiviewcontroller_Addsubview - Fatal编程技术网

SWIFT:无法单击子视图

SWIFT:无法单击子视图,swift,uiviewcontroller,addsubview,Swift,Uiviewcontroller,Addsubview,我创建新的子视图 let storyboard = UIStoryboard(name: "Main", bundle: nil) controller = storyboard.instantiateViewControllerWithIdentifier("menu") as! MenuViewController controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);

我创建新的子视图

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    controller = storyboard.instantiateViewControllerWithIdentifier("menu") as! MenuViewController
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);
    mainView.addSubview(controller.view)
    controller.view.layer.zPosition = 1
    controller.viewDidLoad()
然后我在viewController上添加按钮

但我不能点击按钮

我可以选择我添加照片的新控制器下的文本


代码中很少有问题

首先,从代码的有限范围来看,您没有必要将层的zPosition属性设置为默认值零以外的任何值。通过使用addSubview,将要添加的视图自动添加到所有当前子视图的顶部

其次,通过编程方式创建帧基本上没有错,但这通常会导致不同屏幕尺寸的设备出现问题。另外,当您将视图的宽度设置为与另一个视图的宽度相等时,我建议使用autolayout,它会在宽度发生变化时自动更新宽度。它还允许您跨所有设备屏幕大小/大小类别创建响应界面

controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);
第三,不需要手动触发controller.viewdiload,因为一旦设置了它的帧,就会自动调用它

第四!您正在将视图的框架设置为隐藏在屏幕顶部之外。我不确定这是否是正确的功能,但希望确保您知道,通过将视图的y原点设置为与框架的y原点相等,视图的底部将与其superview的顶部对齐

容器视图控制器是包含其他视图控制器的视图控制器,允许您创建更多模块化代码,并将视图分离到托管视图控制器中。应该改用这种模式

有关更多信息,请参阅

在下面的代码中,我还执行了一项检查,以查看控制器变量是否为nil,这将防止在尝试强制展开控制器时发生崩溃,而该控制器不属于MenuViewController类。可以理解,这有点迂腐,因为您可能确定正在实例化的视图控制器是正确的,但安全总比抱歉好

let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let controller = storyboard.instantiateViewControllerWithIdentifier("menu") as?  MenuViewController {
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);
    // Frame may need to be modified to be made visible ^
    addChildViewController(controller)
    controller.willMoveToParentViewController(self)
    mainView.addSubview(controller.view)
    controller.widMoveToParentViewController(self)
}

你为什么要设置这个位置?将其添加为子视图将自动将其置于最前面。为什么要手动执行所有其他操作?zPosition不起作用:/1一个小问题是:无论视图是否在屏幕上,在视图加载后都会调用viewDidLoad。调用controller.view.frame将导致viewDidLoad运行,甚至在controller.view被添加为子视图之前也是如此。@AaronBrager是的,你说得对!我已经更新了答案。