目前,我在滚动视图中有一个包含ViewControllerUIScrollView类,我还有另一个视图控制器,当前可以在其中接收手势识别。我的目标是能够根据我点击的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或其他内容)。同样,您可以使用使孩子的功能意图更加明确的方法名称。我使用了一些通用的方法和协议名称,因为我不知道各个孩子在做什么。

    08-16 01:16