从子ViewController执行segue

时间:2017-05-14 15:40:24

标签: ios swift uiviewcontroller swift3

目前我有一个包含ViewController的{​​{1}}类,在滚动视图中我有另一个视图控制器,我可以在其中接收手势识别。我的目标是能够根据我点击的subViewController对不同的视图控制器执行segue。

UIScrollView

然后在subView类中我有一个基本的触摸识别功能:

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);

1 个答案:

答案 0 :(得分:0)

我建议让父母执行segue。因此,您需要一种机制让孩子通知家长按钮已被点击。这有两种方法:

  1. 子视图控制器可以定义一个协议,然后让按钮的@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
        }
    }
    
  2. 您也可以遵循明确的协议委托模式,而不是依赖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
        }
    }
    
  3. 注意,使用这两种方法,您可以更改协议的func以包含您想要的任何参数(例如,传回某些UITextField或其他内容)。同样,您可以使用方法名称使子项的功能意图更加明确。我使用了一些通用的方法和协议名称,因为我不知道各个孩子在做什么。