3

ViewController オブジェクトは、データ ソースとして機能できるように、必要な Table View メソッドを実装する必要があります。UITableView.h から:

@required  
-(NSInteger)tableView:(UITableView *)tableView
                       numberOfRowsInSection:(NSInteger)section;
-(UITableViewCell *)tableView:(UITableView *)tableView
                       cellForRowAtIndexPath:(NSIndexPath *)indexPath;

これは少し混乱します。

最初のパラメーター (UITableView *)tableView とは何ですか? メソッドと同じ名前が付けられているのはなぜですか? TableView オブジェクトへのポインターのように見えます。メソッドと同じ名前を付けるのはなぜですか?

次に、これはオーバーロードのように見えますが、実際にはtableview:numberOfRowsInSectiontableView:cellForRowAtIndexPathの 2 つのメソッドがあることを理解しています。どうしてこれなの?

以下のリンクが役に立ちました。特に命名規則について、ここで追加のヘルプをいただければ幸いです。

Objective-Cでのメソッドのオーバーロード?
Objective Cで関数のオーバーロードは可能ですか?
Objective-C で複数のパラメータを渡すにはどうすればよいですか?

4

3 に答える 3

7

Objective-C のメソッドは自己文書化するように設計されており、Smalltalk の豊かな伝統を取り入れています。

あなたがここに持っているものを説明しようと思います- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) section.

  • - (NSInteger)
    この最初の部分は、これがNSInteger オブジェクトを返すObjective Cインスタンスメソッドであることを示しています。-(ダッシュ) はこれがインスタンスメソッドである+ことを示し、a はこれがクラスメソッドであることを示します。括弧内の最初の値は、メソッドの戻り値です。

  • tableView:
    この部分はメッセージ名の一部です。この場合の完全なメッセージ名tableView:numberOfRowsInSection:. Objective-C ランタイムは、このメソッド情報を受け取り、指定された受信者に送信します。純粋な C では、これは次のようになります
    NSInteger tableView(UITableView* tableView, NSInteger section)。ただし、これは Objective-C であるため、追加情報がメッセージ名にパックされています。

  • (UITableView *)tableView
    この部分は入力の一部です。ここでの入力は型UITableView*で、ローカル変数名は tableView です。

  • numberOfRowsInSection:
    この部分は、メッセージ名の 2 番目の部分です。ここでわかるように、メッセージ名は、受信者に渡す情報を示すのに役立つように分割されています。したがって、myObject変数myTableandを使用してオブジェクトにメッセージを送信する場合は、 C++ スタイルの:では なくmySectionObjective-C スタイルの:で入力します。
    [myObject tableView:myTable numberOfRowsInSection:mySection];

    myObject.tableView(myTable, mySection);

  • (NSInteger)section
    これは入力の最後の部分です。ここでの入力は型NSIntegerであり、セクションのローカル変数名を持っています。

于 2013-05-27T04:39:34.600 に答える
3

メソッド名が同じではないため、オーバーロードはありません

tableView:numberOfRowsInSection:
tableView:cellForRowAtIndexPath:

: を含む: は重要であり、名前の一部です。

引数は : の後の部分、: の前の部分はメソッド名の一部であり、メソッド名は引数が絡み合っています。

したがって、2 つのメソッドには 2 つの引数があり、最初の引数はメソッドを呼び出すテーブル ビューです。

このことを理解すれば、メソッド名の後に続く部分に基づいて引数に名前を付けるのは非常に自然なことです。

于 2013-05-27T04:59:52.767 に答える
2

Apple (およびその他の SDK 開発者) は、渡される変数に API パラメーターと同じ名前を付けることがよくあります。一部の人々にとっては、読みやすくするだけです。

つまり、UITableViewDataSource メソッドの場合、最初のパラメーターは、データを取得するテーブル ビューの名前が付けられます。また、このメソッドに渡される変数にも " tableView" という名前が付けられているため、データ ソースとして機能するオブジェクトに、データを提供するテーブルが複数ある場合、そのオブジェクトは、どの特定のテーブルが要求を行っているかを認識します。

これはデリゲート メソッドでよく発生します。たとえば、UITextFieldDelegate メソッドを見てください。ビューに複数のテキスト フィールドがある場合、ユーザーがどの特定のテキスト フィールドに入力または操作しているかを知る必要がある場合があります。

または、実用的な例を挙げてみましょう。2 つの別個のテーブルを持つ単一のビューがあるとします。1 つはホテル用、もう 1 つはレストラン用のテーブルです。両方のテーブルは、データをホストするオブジェクト (たとえば、CoreData で動作するクラスなど) からデータを引き出します。tableView: cellForRowAtIndexPath:そのデータ ソース オブジェクトに対して" " が呼び出されると、最初の " tableView" パラメータにはホテル テーブルまたはレストラン テーブルのいずれかのアドレスが含まれます。これにより、どのデータを返す必要があるかがわかります。

于 2013-05-27T03:50:36.277 に答える