2009-08-27 19 views
3

Cocoa Touch APIでオプションのデリゲートメソッドを実装しています。私がしたいのは、最初にと呼ばれるメソッドを呼び出し、デリゲートを実装していない場合は...結果を変更してから、変更したバージョンを返します。ここでデリゲートが存在しない場合に呼び出されるメソッドを呼び出す方法

は例です:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; { 
    /* this line: */ UIView * headerView = [someObject tableView:tableView viewForHeaderInSection:section]; 
    [headerView setBackgroundColor:[UIColor redColor]]; 
    return headerView; 
} 

マークされた行は動作しません。私はsomeObject = tableView.delegateを置くことができますが、それは私に無限の再帰を与えます。オプションのメソッドが実装されていないと、tableViewが何をするのかを決めるトリックはありますか?私は超有望ではありませんが、可能であれば涼しいでしょう。

答えて

6

あなたはdidnの場合と呼ばれていたであろう何の方法がありませんデリゲートを実装しません。デリゲートはサブクラスと似ていません。彼らは言語機能ではありません。 UITableView(この場合)は何らかの作業を行い、その-delegateプロパティがnilでないかどうかを調べます(これはちょうど "delegate"と呼ばれるランダムなivarです)。もしそうなら、デリゲートがデリゲートを実装しているメソッドを呼び出し、そうであればそれを呼び出し、さらにいくつかの作業を行います。

UITableViewは、デフォルトセクションヘッダービュー(UISectionHeaderCellと呼ばれるプライベートサブクラスです)を公開していないため、Appleは実装方法に関する約束をしていません。私たちに知ってもらうための良い方法を教えてください。問題のビューに到達するにはいくつかの方法がありますが、Appleは私にはわかっている方法をまだ教えていません。

しかし、代理人に関する一般的な質問には、代理人の実装方法ではないため、あなたが求めているものは存在しません。

2

私はのUITableViewはこのような何かない推測している:

if ([delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) { 
    [delegate tableView:self viewForHeaderInSection:section]; 
} else { 
    // Does its own thing instead 
} 

だから私はあなたがオリジナルのものを取得することは、そのように可能であるとは思わないが。

3

respondsToSelectorのドキュメントをチェックアウト - それはあなたのオブジェクトは、よく、セレクタに反応するかどうかをテストし、参照する機能を提供します:)

関連する問題