2012-01-21 11 views
1

私はあなたにpopOver Tableviewコントローラを提供するアプリケーションを持っています。このpopOverにはn個のセルがあります。 Popover内のテーブルセルの1つに触れるたびに、メインビューで関数を呼び出す必要があります。それをどうやってやりますか?Popover UITableViewController mainViewのトリガーアクション

それは、セルをタッチしたら、あまりにもポップオーバーを却下することにいいだろう....

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSLog(@"Cell check %@", [totalArray objectAtIndex:indexPath.row]); 
    [self dismissPopoverAnimated:YES]; 
} 

ここでは、コンソールにセル内のテキストを出力しますが、私のことができるようにする必要がありますそのセルのテキストをメインビューに戻して...ああ、そして、[self dismisspopoveranimated:yes]がうまくいかない...

答えて

3

これを解決する伝統的な方法は、「メイン」ビューコントローラをデリゲートにすることですテーブルビューのクラス:

  1. アプリケーション固有のデリゲートプロトコルを定義し、ユースケース固有のデリゲートメソッドを追加し、それに準拠するように「メイン」ビューコントローラを変更します。デリゲートメソッドは、 "メイン"ビューコントローラー(あなたのケースでは、UITableViewCellまたはそのテキストを含むNSStringのいずれか)に渡すデータの型を持つパラメーターを取る必要があります。
  2. 種類が新しいデリゲートプロトコルであるテーブルビューでクラスにプロパティを作成します。
  3. "メイン"ビューコントローラを新しいプロパティの値として設定して、テーブルビューのクラスに渡します。
  4. tableView:didSelectRowAtIndexPath:メソッドが呼び出されたら、作成したデリゲートに対してデリゲートメソッドを呼び出し、「メイン」ビューコントローラーに渡すデータを渡します。これにより、 "メイン"ビューコントローラは、テーブルセルがポップオーバーで選択されたことに応答する機会を与え、必要な機能を呼び出すことができます。

実際に同じコードを少ないコードでブロックで実行することはできますが、それはもう少し進んでいます。私はここには入りません。

NSNotificationCenterを使用することもできますが、個人的には、絶対に必要な場合を除き、私はその使用を避けています。

+0

私はブロックの使用について知っていることに興味があります。私に何かを提案できますか? –

+1

このアプローチのブロックを使用する要点は、デリゲートプロトコルを作成してそれをテーブルビュークラスに渡す代わりに、ブロックタイプをtypedefし、そのタイプのブロックをテーブルビュークラスに渡すことです。デリゲートオブジェクトでデリゲートメソッドを呼び出すのではなく、テーブルビュークラスが "メイン"ビューコントローラにコールバックする必要があるときは、単にブロックを呼び出します。 Objective-Cブロックのベスト・イントロダクションの1つはhttp://thirdcog.eu/pwcblocks/です。 – erikprice

+0

ありがとうございます。たとえば、セル内でブロックプロパティを作成することができます。その後、テーブルビューのコントローラから、そのブロックプロパティからメソッドを設定することができました。次に、セルからコントローラにデータを渡したいときに、そのブロックメソッドをセルから呼び出すことができます。そうですか?特定のセルを更新するために使用できる行インデックスはどうですか?ブロックプロパティについては、コピーポリシーでそれを定義するのは正しいですか? P.S.あなたの答えは非常に良いので、私はそれを更新しました。 –

関連する問題