2017-05-14 81 views
1

目前我有一个ViewController类包含UIScrollView,在滚动视图中我有另一个视图控制器,我目前可以接收手势识别。我的目标是能够根据我点击的哪个subViewController执行一个segue到一个不同的视图控制器。从子ViewController执行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); 

然后在子视图类我有一个基本的触摸识别功能:

@IBAction func tapOnView(_ sender: UITapGestureRecognizer) { 
    //change main View controller 
} 
+1

显示您尝试过的代码..? –

+0

而不是发表评论中的代码,你应该编辑你的问题。 –

+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 
        } 
    } 
    

注意,用这两种方法,你可以改变你的协议的func包括无论你想要什么参数(例如传回一些UITextField或其他内容)。同样,您可以使用方法名称来使孩子的功能意图更加明确。我使用了一些通用的方法和协议名称,因为我不知道各种孩子在做什么。

+0

谢谢,这正是我正在寻找的东西,但是,您能否准确解释一下协议是什么以及我如何在更远的地方使用它? –

+0

编程中的一个基本原则是尽量让不同的类尽可能松散耦合(例如,孩子不应该被编程为专门与特定的父类一起工作,因为如果您对父类进行了某些更改,则很容易破坏孩子)。所以一个协议实际上是两个松散耦合的类之间的合同,表示“嘿,孩子,你不需要知道任何关于父母的具体事情,除了事实上,如果它符合你的协议,你确实知道它将实现您在协议中定义的这一个方法。“ – Rob

+0

如此类似于Java中的抽象类? –