2011-10-30 7 views
39

Xcode 4.2を使用してiOS 5用のプロジェクトを進めています。 1つのUITableViewControllerがあり、ユーザーが表のセルをタップするとsegueを実行したいが、宛先ビューのコントローラーはそのセルで実行されるアクションに依存する。例えば、ユーザーがセルをタップするとSomeViewControllerをロードしたいのですが、ユーザーが編集モードで同じセルをタップすると、AnotherViewControllerをロードしたいと思います。残念ながら、Xcode 4.2ストーリーボードビルダー内の同じセルに複数のセグを設定する方法はありません。おそらく、コードエディタで手でセグを作成する方法があります。私が達成したいのは、あるビューコントローラを使ってセルで表されるアイテムを「入力」し、別のビューコントローラを使って同じセルが表すアイテムを「編集」する方法をユーザに提供することです。テーブル・エディット・モードになって初めて2番目のビュー・コントローラー(エディター)に切り替えるのは私の最初でしたが、もっと良い方法があるかもしれません。どんな助けもありがとう。UITableViewCellのタップで条件付きセグを実行

+2

が、私はちょうどそれを考え出しました。それは簡単で、Xcodeのストーリーボードエディタを使って行うことができます。私は別のビューコントローラを指す私のTableViewControllerに2つのセグを追加しました。そして、ユーザがセルを選択し、編集モードで行われるかどうかに応じて、適切なコードをトリガします。以前私は同じセルの魔女に複数のセグを追加しようとしていませんでした。 – Darrarski

+3

これを答えにこだわって、セグをどのように設定するのかを正確に示してくれればうれしいです。 – JohnMerlino

+0

私は同じ問題に直面している、私はソースからseguesと2つの宛先ビューコントローラを持っているが、どのように特定のsegueのをトリガーするのか分からない??? – Bear

答えて

53

ストーリーボードを見ながら、ソースView ControllerからDestination View Controllerにドラッグ&ドロップします。これにより、ソースView Controllerからプログラムでトリガできるセグが作成されます。 Segueに名前を付けるようにしてください。この名前は、ソースView ControllerのperformSegue:withIdentifier:メソッドに渡されます。

+5

私はこの質問に見られた回答ではしばしば欠落しているビットは、通常、あなたが細胞からそれを切り離したので今セグに。答えは、静的なテーブルビューであっても、あなたのUITableViewControllerに 'tableView:didSelectRowAtIndexPath:'を実装することです。そのメソッドの本体で条件コードを置き、条件が正しいときに 'performSegue:withIdentifier:'を呼び出す – Rhubarb

+0

ポイントは、tableViewプロトタイプセルから複数のセグを設定できるということです。それらに別個の識別子を与えてください。あなたのdidSelectRowAtIndexPathでそのように:if([self.tableview isEditing])条件を設定し、あなたが設定した識別子を使用する際にsegueを引き起こすことができます。 – smileBot

33

これ以外の多くの場所で上記の選択されたものを読んだ後、ちょうどその理由があります。です。正解です。通常、 。テーブルビューのセルから次のコントローラにCtrlキーを押しながらドラッグすることで、通常の方法でセグを作成すると、自動的に2つのことが行われます。セル内

  1. タッチセグエが

を行っているが、もちろん、あなたがセグエをブロックすることはできません

  • が検出されました。

    そして今、あなたはする場合は、条件付きセグエ、(他の回答で述べたように)あなたがそのセグエを削除してのUITableViewControllerから新しいものを作成します(オブジェクトナビゲータではなく、ストーリーボードからそれをドラッグして)次へコントローラー - それに名前をつけてください。

    そして、これは私が見逃していた部分です。をテーブルビューコントローラに実装することで、以下のようにプログラムで条件付きでsegueを実行できます。

    興味のあるセルが選択されているかどうかを確認するために、セルを何らかの形で識別する必要があります。静的なテーブルのインデックスパスを知ることでそれを行うことができますが、私は静的なテーブルなのでデキューする必要はありませんが、IBのセルの一意の識別子を設定してチェックする方が好きです。そうすれば、静的なテーブルでセルを上下に動かすと、このコードを変更する必要はありません。私はセグエでセルを送信する方法

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        // Find the selected cell in the usual way 
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    
        // Check if this is the cell I want to segue from by using the reuseIdenifier 
        // which I set in the "Identifier" field in Interface Builder 
        if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) { 
    
        // Do my conditional logic - this was the whole point of changing the segue 
        if (myConditionForSegueIsSatisfied) { 
         // Perform the segue using the identifier I was careful to give it in IB 
         // Note I'm sending the cell as the sender because that's what the normal 
         // segue does and I already had code counting on that 
         [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell]; 
        } 
    } 
    

    注 - セルからの通常のセグエがいることをして、私はもともとnilを通過していたし、それに依存していた私のコードは動作を停止しました。

  • +0

    それは私が必要としたことでした。ありがとう – Critter

    +0

    プロジェクトを作成するためにマスターディテールテンプレートを使用した場合は、sequeを削除して再追加することが重要でした。ありがとうございました。 – Stiefel

    +0

    それをUITableViewControllerからドラッグしてください!それは...私はどのように(プログラムではなく)特定のビューに結び付けられていないセグを作成するのかと思っていました。 – maganap

    5

    これは古い質問といくつかの偉大な正解があるが、私は、私はこれに遭遇したとき、私が参考に感じたいくつかの追加情報を投稿します:

    1. あなたはCTLによるストーリーボードでセグエを作成した場合+ SomeVCからAnotherVCにドラッグして削除します。

    2. オブジェクトナビゲータで、ctl +は、SomeVCからAnotherVCへのViewControllerレベル(通常はVCの名前の階層の最初の部分)でドラッグします。 segueに一意の識別子を付けます。

    3. 上記のようにtableView: didSelectRowAtIndexPath:を実装します。

    4. は、私は偉大な答えをみんなのためにtableView: didSelectRowAtIndexPath:

      switch (indexPath.row) { 
      case 0: 
          [self performSegueWithIdentifier:@"yourIDHere" sender:self]; 
          break; 
      case 1: 
          // enter conditional code here... 
          break; 
      case 2: 
          // enter conditional code here... 
          break; 
      // ... for however many cells you require 
      
      default: 
          break; 
      

      }

    おかげでswitchステートメントを使用することが役に立ったと評価してい。

    0

    あなたは簡単に実装することで、カスタムのUIViewControllerのあらゆるセグエの開口部を制御することができます。

    override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }