2017-07-21 6 views
0

クラス関数を介して別のクラスからsegueを実行しようとしています。ストーリーボードを使用せずに別のクラスからSegueを実行する

私はMyTableViewControllerというクラスを持っています。そのクラスでは、私はタイプコントローラAnswerViewControllerを構築しました。このビューコントローラへのセグは、Extension : MyCellの条件が満たされたときに発生すると考えられます。私が抱えている問題は、関数showNextViewが呼び出されていないということです。

私はPerform Segue From Another Swift File via a class functionPerform Segue from another class with helper functionの両方に記事を読んでいるが、これらの両方が(私はストーリーボードを使用していないので、できないことと、実際にseguesを持っていない、だけpushViewController)ビューコントローラを構築する前セグエを作成します。

class MyTableViewController: UITableViewController { 

//Construct View Controller 
let answerViewController = AnswerViewController() 

//Create goToNextView function which will be called in extension MyCell 
func goToNextView(){ 
    navigationController?.pushViewController(answerViewController, animated: true) 
} 
} 



extension MyCell: YSSegmentedControlDelegate{ 
func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) { 


    tagToIndex[actionButton.tag] = index 
    print(tagToIndex) 

//Condition To Be Met 
if tagToIndex == [0:1,1:0,2:1]{ 

//Access function goToNextView from MyTableViewController 

    func showNextView(fromViewController : MyTableViewController){ 
     fromViewController.goToNextView() 
    } 
} 

}   
} 

セグが発生するようにshowNextView関数を呼び出すにはどうすればよいですか?

おかげで、 ニック

答えて

1

あなたはこのような方法で行うことはできません。 showNextView関数はsegmentedControl(_, willPressItemAt)の内部にネストされています。つまり、その外部にアクセスすることはできません。一般にネストされた関数は使用しないでください。

問題を解決するには、セルの代理人を作成し、アクションが発生したことをビューコントローラに通知する必要があります。

簡単な例:

protocol MyCellDelegate: class { 
    func myCellRequestedToOpenAnswerVC(cell: MyCell) 
} 

class MyCell { 
    weak var delegate: MyCellDelegate? 

    // rest of your inplementation 
} 

その後、へsegmentedControl(_, willPressItemAt)変更:

func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) { 


    tagToIndex[actionButton.tag] = index 
    print(tagToIndex) 

//Condition To Be Met 
if tagToIndex == [0:1,1:0,2:1]{ 

    self.delegate?.myCellRequestedToOpenAnswerVC(cell: self) 
} 

}   

最後の部分はMyTableViewControllerで起こる - まず、あなたのcellForRow方法でのように、何かをデリゲートとしてビューコントローラを割り当てますthis - cell.delegate = self、ビューコントローラをMyCellDelegateに準拠させる:

extension MyTableViewController: MyCellDelegate { 

    func myCellRequestedToOpenAnswerVC(cell: MyCell) { 
     self.goToNextView() 
    } 
} 

これで、条件が満たされるたびに、ビューコントローラに通知され、それに応じて動作するようになります。

プロトコルと委任のパターンに精通していない場合は、reading through the docsをお勧めします。これはCocoaTouchで広く使用されているものです。

関連する問題