web-dev-qa-db-ja.com

'didSelectRowAtIndexPath'でセグエにアクセスする方法-Swift / IOS

prepareForSegue関数からのセグエを使用してデータを渡す方法を知っていますが、2つの異なるViewControllerに2つの可能なセグエがあるTableViewCellがあります(今のところA、Bと言ってください)。 ここ テーブルセル自体ではなく、セグエをビューコントローラーに接続するのが最善であることが提案されました。これは実際には完全に機能しました。しかし、セルがクリックされたときに2番目のView Controllerに情報を渡したいので、Source ViewControllerに接続したsegueにアクセスする方法。

コード:

PrepareForSegueの内部

if segue.identifier == "showQuestionnaire"{
      if let indexPath = self.tableView.indexPathForSelectedRow() {
        let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController
        let patientQuestionnaire = patientQuestionnaires[indexPath.row] as! PatientQuestionnaire
        controller.selectedQuestionnaire = patientQuestionnaire
        self.performSegueWithIdentifier("showQuestionnaire", sender: self)
      }
    }

繰り返しますが、この質問はprepareForSegueを介した情報の受け渡しに関するものではありません

8
Sashi

セルが選択されたかどうかを判断するには、didSelectRowAtIndexPathメソッドを使用する必要があります。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("showQuestionnaire", sender: indexPath);
}

次に、prepareForSegueメソッドで

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "showQuestionnaire") {
        let controller = (segue.destinationViewController as! UINavigationController).topViewController as! QuestionnaireController
        let row = (sender as! NSIndexPath).row; //we know that sender is an NSIndexPath here.
        let patientQuestionnaire = patientQuestionnaires[row] as! PatientQuestionnaire 
        controller.selectedQuestionnaire = patientQuestionnaire
    }
}

説明する...

  1. インデックスパスを送信者として使用したので、インデックスパスを簡単に渡すことができます。他のUITableViewメソッドを使用して現在選択されているセルを確認することもできますが、私は常にこの方法で成功しています。
  2. performSegueWithIdentifierperformSegueWithIdentifierにつながるため、prepare forsegueメソッド内にprepareForSegueを入れることはできません。あなたはただ目的もなくぐるぐる回っています。 (セグエを実行したい場合は、prepareForSegueが常に実行されます)
  3. 行が選択されている場合、prepareForSegueは単独では実行されません。ここでdidSelectRowAtIndexPathが必要です。前述のように、メソッドの外部にperformSegueWithIdentifierが必要です。これは、didSelectRowAtIndexPathにある必要があります。
28
Nate Lee