2011-12-17 21 views
6

私の問題は一般的な問題のようですが、答えが見つからないようです。UIAlertViewへの応答に基づくUITableViewCellからの条件付きセグナビゲーション

ユーザーがカスタムUITableViewCellをタップすると、アラートを表示してからアラートへの応答に基づいて、同じビュー(キャンセルを選択するユーザー)または別のビューを表示する(ユーザーが続行を選択した場合)。そして私はストーリーボード機能&を使ってこれをしたいと思います。

これについてはどうすればよいですか?あなたはこれを古風なやり方でしなければなりませんか?

答えて

11

@userアラートを作成すると、古いファッションの方法が表示されます。私は、ストーリーボードの機能をこれとは違う方法で知っています。ストーリーボードが助けることができるのは、セグのことです。セグをプログラムで呼び出すことができます。アラートビューのキャンセルボタンを使用すると、ただ戻ることができます(つまり何もしません)。もう一方のオプションでは、別のビューを表示するために、セグをプログラムで呼び出すことで、目的のビューに切り替えることができます。あなたのストーリーボード上に他の何らかの理由で適切なセグを定義していない場合は、ボタンを作成してそれを使ってセグを作成し、名前を付けてください。ストーリーボードでそれをクリックしてセグを命名し、属性インスペクターを使用して名前(識別子)を付けます。次に、ボタンを非表示にするか、ビューから外します。私は通常、これらのタイプのボタンをツールバーに置き、スペーサーを使用してそれらをビューから外します。

コールこのようなアラートビューのデリゲートからセグエ:

[self performSegueWithIdentifier: @"done" sender: self]; 

はまたセグエの準備のために必要なすべてのタスクを実行するには、このメソッドを実装します。ここではいくつかのサンプルコードです

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     // [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 
     // [[segue destinationViewController] setSelectedClient:selectedClient]; 
    } 
} 
+1

それは私がやったことです。そのようなハックのように思えた、私は見過ごしたより明白な方法があると思った。 –

+1

@user、あなたや他の誰かがこれを読んでもっと良い方法を見つけたら、私たちに知らせてください。 –

8

ますstartingViewControllerから複数のdestinationViewControllerに直接セグを作成することができます。これらは、プログラムで「実行」することができます。隠しボタンを作成する必要はありません。ハックのように見えます。

+0

+1ですが、どのようにしてstartViewControllerから複数のdestinationViewControllerに直接セグを作成しますか? View Controller間でCtrlキーを押しながらドラッグし、セグの名前を付けることを意味しますか? – brainjam

+1

はい、私は、表示コントローラ間でCtrlキーを押しながらドラッグすることを意味しました。主な点は、ストーリーボードビュー内でビューコントローラの要素を選択せず​​、実際のビューコントローラ自体を選択し、Ctrlキーを押しながら他のビューにドラッグすることです。私はこれを自分でやったことがうまくいった。 – DataJock

+0

ニース!もう私のためのファントムボタンはありません。 –

4

OK私は好きなストーリーボードに合わせて解決策を思いつきました。

例:

マイテーブルビューは、グループ化された2つのセクションを有し、そして細胞は動的プロトタイプです。セクション0には1行が含まれています/ UITableViewCell &私はそれを扇動したくありません。セクション1には、セグをトリガーしたい複数のセルが含まれています&詳細にドリルダウンします。ストーリーボードで

  • I宛先ビューコントローラにtableviewcellを連結セグエを除去します。
  • ソースビューコントローラを宛先ビューコントローラに直接リンクする「一般的な」セグを作成しました。
  • segueの属性では、識別子( 'EditTimePeriod')を設定し、タイプをプッシュに設定します(私はModalがまったく同じであると考えます)。ソース・ビュー・コントローラにおいて

:私は、共通の「AddTimePeriod」セグエ両方扱うprepareForSegue方法において

  • と共に、私のUIBarButtonItem(ADD)からコントロールを、ドラッグ「ジェネリック」( vc - > vc) 'EditTimePeriod' segue。didSelectRowAtIndexPath方法を、ここで私の条件を入れて:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        // handle the click of the 'Add' bar button item  
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         // database & entity stuff for adding the new one to the mOC, etc 
        } 
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row]; 
         tpvc.timePeriod = newTP; 
        } 
    } 
    
  • は、その後、私はのtableViewを実装しました。選択された行は、私は手動でEditTimePeriodセグエと呼ばれるセクションゼロの外にあった場合、選択されたtableviewcellとして送信者を定義する:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    
        if(self.tableView.indexPathForSelectedRow.section!=0){ 
         [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]]; 
        } 
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    
        return;  
    } 
    

は、それが選択できないように、セクション0のセルをコーディングするとよいでしょう最初の場所に! これは役に立ちます。

**そして5分後に私はもう一度見て、セクション0のデータをセクションヘッダーに移動することができたことを認識しました。これはより直感的で、とにかく使用されていませんでした。条件/チェックを一切必要とせずに、各テーブルビューセルから標準セグのデザインを開いたままにします。とにかく良い運動でした:)

関連する問題