objective-c - UITableViewDataSource中的cellForRowAtIndexPath如何实现?
高洛峰
高洛峰 2017-04-21 10:58:06
0
2
588

在controller中delegate了UITableViewDataSource以后,是必须实现这个方法以展示UITableView的。它的方法原型如下

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

能否结合例子具体解释下NSIndexPath的含义,另外与它想对应的还有一个必须实现的方法

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

这个section表示的又是什么呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
PHPzhong

先解釋一下TableView的佈局,一個TableView的內容兩級,Section和Section中的Row,每個Row對應的視圖成為TableViewCell。拿 設定.app 舉例,如下圖:

圖中有兩個Section
Section 0 中有6個Row -- 飛航模式~操作員
Section 1 中能看到3個Row -- 聲音~桌面

再說問題裡的兩個方法。

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

這個方法回傳的就是某個cell,可以自訂各種樣式渲染,也可以用幾種預設樣式去渲染。
indexPath標示的是你要渲染的這個cell的位置,indexPath物件裡有兩個屬性,section和row,顧名思義,可以定位某個cell。
注意:這個方法會在某個cell出現在螢幕中的時候被調用,而且是沒出現一次就被調用一次。因為一個cell物件在螢幕可見區域消失的時候被回收,給其他出現在可見區域的cell重複使用。所以,在這個方法裡渲染某個cell的時候,最好用個for循環或什麼的把cell清理乾淨。

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

這個方法,是在TableView產生的時候被呼叫(或是對tableView物件呼叫reloadData時),傳回某個section中的row(cell)數量。
例如,在 設定.app 的介面裡,應該是

switch (seciton) {
    0 :
        return 6;
    1 :
        return 3;
}
return 0;
洪涛

1、NSIndexPath主要包含(NSUInteger)section(NSUInteger)row,每个row必然是属于一个section的,否则这个row没有意义,- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section里面就是表明各section有多少row
2.開啟Contacts,里面的那些A、B、C...这样的标题就属于section headerheader + rows + footer就构成了一个完整的section. 可以通过- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;進行客製化header,footer類似

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板