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

저는 obj-c에 매우 익숙하지만이 메소드 서명을 이해하지 못합니다. 특히이 메소드가 메소드 이름 앞에 여분의 요소가 모두있는 이유와 그 의미 마찬가지로 -은 인스턴스 메서드이며, 반환 유형은 NSIntegerobj-c 메소드 서명을 설명해주세요.

입니다.하지만 tableView: (UITableView *) tableView은 메서드 이름 앞에 표시됩니다.

UITableViewDataSource 프로토콜의 일부 인스턴스 메소드에는 이름의 앞부분이 없습니까? numberOfSectionsInTableView은 다르게 정의됩니다.

누군가 나에게 설명해 줄 수 있습니까?

- 

이가 인스턴스 메소드의 의미 :

+0

downvote에 대한 이유는 무엇입니까? – Alan

답변

9

는 부분으로 분해 할 수 있습니다. 대안은 클래스 메소드를 의미하는 +입니다.

(NSInteger) 

이것은 메소드의 리턴 유형입니다. 이 경우는 NSInteger입니다.

tableView: 

(전체, tableView:numberOfRowsInSection:에서,) 셀렉터 명의 제 1 성분. :은 매개 변수가 뒤 따른다는 것을 나타냅니다.

(UITableView *) 

매개 변수의 유형입니다.

tableView 

매개 변수의 이름입니다. 이것은 메소드 시그니처 (메소드에 대한 힌트를 제외하고는)와는 크게 관련이 없지만 구현시에는 해당 매개 변수에 바인드 된 변수입니다.

numberOfRowsInSection: 

선택자 이름의 다음 구성 요소.

(NSInteger) 

두 번째 매개 변수의 유형입니다.

section 

두 번째 매개 변수의 이름입니다.


주, 전체 라인이 유일한 필수 공간 tableViewnumberOfRowsInSection: 사이이다. 다른 모든 공간은 가장 일반적인 형식은이 같은 모습을 찾을 수 있지만

-(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

좋아, 그럼 왜 선택자 이름이'tableOutlook : numberOfRowsInSection :'보다는'numberOfRowsInSection :' – Alan

+0

@ Alan인지는 모르겠다. 전체 선택기 이름에는 선택기의 모든 구성 요소가 포함됩니다. 'tableView :'는'tableView : numberOfRowsInSection :'과 다르다. 이것은'cellViewRowAtIndexPath :'와는 다른'tableView : cellForRowAtIndexPath :'와는 다르다. 메소드 서명과 메소드 호출은 매개 변수에 중위 표기법 (infix notation)을 사용하지만 일부 사람들은 키잉 된 인수에 대해 실수합니다. –

+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 

여러 담당 하나 datasource/delegate 물체가있는 경우 그 방법에 주어진다 UITableView 당신은 어느 것이 데이터를 요구하고 있는지/어떤 방법을 호출하고 있는지 구별 할 수 있습니다.

이것은 매우 일반적인 패턴입니다.

당신이 UITableViewController 가능성을 사용하는 경우는 일반적으로 단지 PARAMS 예를 들어,의 순서에 대한 하나의 UITableView

이유 다루고있는 당신이 어쨌든 tableView 매개 변수를 무시하는 것입니다 tableView은 처음에는 선호도가 높고 여러 매개 변수가있는 경우 더 잘 읽 힙니다. 그러나 tableView 매개 변수 만있는 경우에는 마지막 매개 변수가 있어야합니다.

관련 문제