2017-05-14 79 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中的抽象類? –