目前,我在滚动视图中有一个包含ViewController
的UIScrollView
类,我还有另一个视图控制器,当前可以在其中接收手势识别。我的目标是能够根据我点击的subViewController对另一个视图控制器执行segue。
let scrollView = UIScrollView(frame: CGRect(x:0,y:0, width: self.view.frame.width, height:self.view.frame.height-106))
scrollView.delegate = self;
self.view.addSubview(scrollView);
let subView11 = subView(nibName: nil, bundle: nil);
subView1.view.frame = CGRect(x:0,y:0, width: self.view.frame.width, height: CGFloat(openReelHeight));
self.addChildViewController(subView1);
scrollView.addSubview(subView1.view);
subView.didMove(toParentViewController: self);
然后在subView类中,我具有基本的触摸识别功能:
@IBAction func tapOnView(_ sender: UITapGestureRecognizer) {
//change main View controller
}
最佳答案
我建议让父母来进行检查。因此,您需要一种机制来让孩子告知父母该按钮已被点击。这是两种方法:
@IBAction
调用父视图控制器中的协议。protocol ChildViewControllerDelegate {
func child(_ child: ChildViewController, didTapButton button: Any)
}
class ChildViewController: UIViewController {
@IBAction func didTapButton(_ sender: Any) {
if let parent = parent as? ChildViewControllerDelegate {
parent.child(self, didTapButton: sender)
}
}
}
显然,父视图控制器需要遵循该协议:
extension ViewController: ChildViewControllerDelegate {
func child(_ child: ChildViewController, didTapButton button: Any) {
// now segue to whatever you want
}
}
parent
的视图控制器包含关系:protocol ChildViewControllerDelegate: class {
func didTapButton(_ sender: Any)
}
class ChildViewController: UIViewController {
weak var delegate: ChildViewControllerDelegate?
@IBAction func didTapButton(_ sender: Any) {
delegate?.didTapButton(sender)
}
}
然后,当父母添加孩子时,必须显式设置
delegate
:let child = storyboard!.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
addChildViewController(child)
child.delegate = self
// add the child's view to your view hierarchy however appropriate for your app
child.didMove(toParentViewController: self)
而且,当然,父级必须再次遵守此协议:
extension ViewController: ChildViewControllerDelegate {
func didTapButton(_ sender: Any) {
// segue to next scene
}
}
请注意,使用这两种方法,您都可以更改协议的
func
以包括所需的任何参数(例如,传回UITextField
或其他内容)。同样,您可以使用使孩子的功能意图更加明确的方法名称。我使用了一些通用的方法和协议名称,因为我不知道各个孩子在做什么。