2012-01-04 8 views
0
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section 

私はobj-cにはとても慣れていますが、このメソッドのシグネチャはわかりません。具体的には、このメソッドがメソッド名の前に余分なものをすべて持っている理由とその意味。同様に、-はインスタンスメソッドであり、戻り値の型はNSIntegerこのobj-cメソッドの署名を私に説明してください

ですが、なぜメソッド名の前にtableView: (UITableView *) tableViewがあるのですか?

UITableViewDataSourceプロトコルのインスタンスメソッドには、名前の前に何もありません。 numberOfSectionsInTableViewは異なって定義されています。

誰かが私にそれを説明できますか?これは、それがインスタンスメソッドの意味

- 

+0

downvoteの理由は? – Alan

答えて

9

部品にそれを打破することができます。別の方法は、クラスメソッドを意味する+です。

(NSInteger) 

これはメソッドの戻り値の型です。この場合はNSIntegerです。

tableView: 

セレクタ名の最初のコンポーネント(全体では、tableView:numberOfRowsInSection:)です。 :は、パラメータが続くことを示します。

(UITableView *) 

パラメータのタイプ。

tableView 

パラメータの名前。これはメソッドのシグネチャではほとんど無関係ですが(目的を読んでいる人にはヒントを除いています)、実装ではこれがそのパラメータにバインドされている変数です。

numberOfRowsInSection: 

セレクタ名の次のコンポーネント。

(NSInteger) 

第2パラメータのタイプ。

section 

第2パラメータの名前。


注、この全体のラインでのみ必要な空間はtableViewnumberOfRowsInSection:間の1つです。他のすべてのスペースは、最も一般的な形式は、あなたがこのようなルックスを見つけるのに

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section 

を生成するために省略されることができます:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

編集:まだに関するいくつかの混乱がありますようにが見えます質問の後半部分。セレクタのtableView:コンポーネントは、質問をするUITableView*インスタンスを提供するためのものです。UITableViewDataSourceプロトコルのすべてのメソッドは、送信テーブルビューを引数として提供します。これらのメソッドには他の引数があり、そうでないものもあります。追加の引数を持つものはすべてtableView:someOtherThing:(たとえばtableView:numberOfRowsInSection:)とフォーマットされていますが、これは必須ではありません。 numberOfRowsInTableView:forSection:またはnumberOfRowsInSection:ofTableView:、さらにはfoo:bar:と呼ばれることもありますが、開発者とコードを後で読む人の両方を支援する一貫した命名体系を維持するために、API開発者が書いた文章の選択です。他のパラメータを使用しないメソッドは、numberOfSectionsInTableView:のように見えます。これはメソッドの自然な名前なので、これは無効なセレクタ(最初のの後のすべてのコンポーネントはにパラメータが関連付けられている必要があり、したがって、末尾が:である必要があるため)tableView:numberOfSectionsと呼び出すことはできません。いずれの場合も

+0

さて、なぜセレクタ名は 'numberOfRowsInSection:'ではなく、tableView:numberOfRowsInSection: ' – Alan

+0

@ Alanであるのですか?完全なセレクタ名には、セレクタのすべてのコンポーネントが含まれます。 'tableView:'は 'tableView:numberOfRowsInSection:'とは異なります。これは 'tableView:cellForRowAtIndexPath:'とは異なり、 'cellForRowAtIndexPath:'とは異なります。メソッドのシグネチャとメソッド呼び出しでは、パラメータにinfix表記を使用していますが、一部の人はキー付き引数について誤っていますが、これは単なる構文上のことです。 –

+0

@Alan: '[foo callMethodWithArg1:arg andArg2:arg2]'と書くと、実際には '-callMethodWithArg1:andArg2:'メソッドが呼び出され、引数 'arg'と' arg2'が渡されます。 –

2

データを求めるか、デリゲートメソッドを呼び出しているtableViewへの参照は、ユーザー

//               | 
//               V 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

//          | 
//          V 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

あなたが複数の担当している1 datasource/delegateオブジェクトを持っている場合、その方法に与えられ、 UITableViewあなたはどちらがデータを求めているのか/どのメソッドを呼び出すのかを区別できます。

これはかなり一般的なパターンです。

あなたがUITableViewControllerを使用している場合、可能性はあなたが正常に一つだけUITableView

のparams例えばの順序付けの理由を扱っているとして、あなたがとにかくtableViewパラメータを無視するということですtableViewは初めかもしれませんが、複数のパラメータがある場合は読みやすくなりますが、tableViewパラメータしか持たない場合は最後にする必要があります。

関連する問題