UIViewcontroller作为子视图没有得到触摸事件

问题描述:

我想添加一个UIViewController到另一个UIViewController,然后有一个UIGestureRecogniser它。这是一个坏主意吗?我似乎根本没有收到子视图控制器的触摸事件。我可以启用它们吗?或者这只是一个愚蠢的做法?UIViewcontroller作为子视图没有得到触摸事件

CODE:

在主视图控制器

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 

和SliderViewController

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

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

} 

如果我和

self.present(slider, animated: true, completion: nil) 

呈现它而不是添加作为一个子视图,它 工作正常。

+0

加入'里面UIViewController' 'UIViewContoller'不是你想为iOS开发的方式。改用'UIView'。 – JuicyFruit

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

要添加slider作为一个子视图控制器,你应该做的:

self.addChildViewController(slider) 
self.view.addSubview(slider.view) 
slider.didMove(toParentViewController: self) 

删除子视图控制器时,你应该做相反的顺序正好相反:

slider.willMove(toParentViewController: nil) 
slider.view.removeFromSuperView() 
slider.removeFromParentViewController() 
+0

这工作 - self.addChildViewController(滑块)是使差异的线。slider.didMoveToParentViewController(self)没有任何影响。将在一分钟后接受您的答案它可以让我,谢谢! –

+0

你应该仍然调用'didMoveToParentViewController'因为它会导致子视图控制器被通知通过一些回调被添加为子视图控制器,你可能不需要如此没有实现。 – ozgur

尝试添加

slider.didMoveToParentViewController(self) 

self.view.addSubview(slider.view) 
+0

感谢您的答复 - 没有区别,虽然:( –