2012-03-08 3 views
2

UITableViewControllerには、自分のサブクラスでカスタマイズしたカスタムセルがあります。 このサブクラスでは、ボタンを追加しました。ナビゲーションコントローラのスタックにビューをプッシュしたいと思います。カスタムセルからナビゲーションコントローラにどのようにアクセスできるかわからないので、これを行う方法はわかりません。UITableViewCellからビューをプッシュする方法

答えて

5

ここに情報が必要です。どのクラスがテーブルを保持していますか、どのクラスはテーブルビューのデリゲートですか?

最も単純なケースでは、1つのクラスで作業しています。それは[self.navigationController pushViewController: xyz]よりでしょう。

しかし、独自のサブクラス化されたUITableViewCellsを持っている場合は、セルクラスとビューコントローラの間で通信する必要があります。これを行うには、セルクラスのプロパティまたは独自のcustomCellデリゲートを設定します。

また、あなたのviewControllerがリスニングしている通知([[NSNotificationCenter defaultCenter] addListener: self target: @selector(...) name: @"cellButtonTouchedNotification"])の通知([[NSNotificationCenter defaultCenter] postNotification: @"cellButtonTouchedNotification"])を送信することもできます。この場合、userInfoプロパティを使用して、どのセルがタッチされたかを覚えておくことができます。

もう1つは、ボタンを外部からアクセスできるようにすることです(プロパティなど)。次に、tableViewDelegateのメソッドcellForRowAtIndexPath:にターゲットを追加することができます。 Smth。 like [myCustomCell.button addTarget: self selector: @selector(...)];タグを使用して行myCustomCell.button.tag = indexPath.rowを識別できます。

+0

は別のアイデアを編集します。 – calimarkus

+0

私はUIViewControllerを持っています。これにはテーブルビューが含まれています。 tableviewデリゲートはselfに設定されているので、それを持つUIViewControllerです。 私は自分のサブクラス化されたUITableViewCellsを持っています。実際、私の問題はUIViewControllerとUITableViewCellsの間で通信することです。私はあなたの2つのソリューションが私が探していたものだと信じています。私はそれらを試して、あなたに知らせるつもりです。ありがとう – ChrisTauziet

+0

それは、ありがとうでした。私はあなたの最後のアイデアを使用し、それは完璧に正常に働いた。 – ChrisTauziet

0

セル内のUITableViewControllerへのポインタを保持します。セルのコンストラクタで渡すことも、後で設定することもできます。次に、テーブルビューコントローラでpushViewControllerを呼び出すことができます。

さらに美しい解決策は、セルの代理人を定義することです。たとえば、buttonClickedコールバックを持つButtonCellDelegateと言うことができます。デリゲートは、UITableViewController(またはView Controllerにアクセスできる他の場所)に実装します。上記のようにデリゲートをセルに渡し、ボタンがクリックされたときにセルからコールバック関数を呼び出します。

5

委任を使用します。ここでは簡単な例です。あなたは(ナビゲーションコントローラに挿入され、例えば、テーブルビューコントローラ)あなたのセルのためのデリゲートにメッセージを送信]ボタンをクリックし

//.h 
@protocol MyTableViewCellDelegate; 

@interface MyTableViewCell : UITableViewCell 

@property (assign, nonatomic) id <MyTableViewCellDelegate> delegate; 

//your code here 

@end 

@protocol MyTableViewCellDelegate <NSObject> 

@optional 

- (void)delegateForCell:(MyTableViewCell *)cell; 

@end 

//.m 
@implementation MyTableViewCell 

@synthesize delegate = _delegate; 

- (void)prepareForReuse { 
    [super prepareForReuse]; 

    self.delegate = nil; 
} 

- (void)buttonAction { 

    if ([self.delegate respondsToSelector:@selector(delegateForCell:)]) 
     [self.delegate delegateForCell:self]; 
} 

@end 

。ここで

コントローラ

@implementation YourController 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSString *reuseIdentifier = @"MyCustomCell"; 
    MyTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 

    if (cell == nil) 
     cell = [[[MyTableViewCell alloc] initWithMyArgument:someArgument reuseIdentifier:reuseIdentifier] autorelease]; 

    [cell setDelegate:self]; 

    // update your cell 

    return cell; 
} 

- (void)delegateForCell:(MyTableViewCell *)cell { 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

    // do your stuff 

    [self.navigationController pushViewController:...]; 
} 

@end 
関連する問題