UIViewcontroller作为子视图未获得触摸事件

Jon*_*ett 1 ios swift

我试图将一个UIViewController添加到另一个UIViewController,然后在其上有一个UIGestureRecogniser。这是一个坏主意吗?我似乎根本没有接收到子ViewController的触摸事件。我可以启用它们吗,或者这只是愚蠢的做法?

码:

在主ViewController上

let slider = SliderViewController()

slider.view.frame = CGRect(x: 0, y: 100, width: self.view.frame.size.width, height: self.view.frame.size.height/4)

self.view.addSubview(slider.view)

slider.view.isUserInteractionEnabled = true // doesnt seem to make any difference
Run Code Online (Sandbox Code Playgroud)

并在SliderViewController上

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    print("touches began") // never gets called

}
Run Code Online (Sandbox Code Playgroud)

如果我提出

self.present(slider, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

而不是添加为子视图,它可以正常工作。

ozg*_*gur 5

您可能还需要将滑块控制器添加为子控制器。通过这种方式,UIKit会知道要添加为子视图的视图已绑定到某个视图控制器,因此它将确保子视图控制器将接收相同的UI事件,例如用户触摸,方向更改,与生命周期相关的回调,例如viewDidLoadviewWillAppear等。

要将其添加slider为子视图控制器,您应该执行以下操作:

self.addChildViewController(slider)
self.view.addSubview(slider.view)
slider.didMove(toParentViewController: self)
Run Code Online (Sandbox Code Playgroud)

删除子视图控制器时,应按相反的顺序进行相反的操作:

slider.willMove(toParentViewController: nil)
slider.view.removeFromSuperView()
slider.removeFromParentViewController()
Run Code Online (Sandbox Code Playgroud)