2011-11-10 46 views
47

我已經閱讀過蘋果文檔,對於像我這樣的Objective-C這樣的初學者來說這是不可理解的。我試圖按照link這個例子實現多列UITableView,它只是不起作用,所以我需要了解cellForRowAtIndexPath如何工作,對我個人來說這個方法看起來相當複雜。cellForRowAtIndexPath如何工作?

1)它返回什麼? UITableViewCell?但爲什麼它看起來很奇怪?

-(UITableViewCell *)tableView:(UITableView *)tableView 
  • 那是什麼?你能解釋一下嗎?

2)它是如何被調用,什麼是更重要的是我怎麼連接它到某個UITableView?如果我有兩個UITableView的名稱爲firstTableViewsecondTableView,我希望它們有所不同(以不同方式執行cellForRowAtIndexPath)?我應該如何將我的UITableViews這個

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

的方法接受NSIndexPath,不UITableView。我該怎麼辦?

+0

剛拿到了這個問題。我知道這是6歲,但無論如何...實例方法描述爲: - (return_type)firstPartOfMethodName:(first_param_type)first_param secondPartOfMethodName:(second_param_type)second_param ...',其中'return_type'是類型該方法返回的值,'first_param_type','second_param_type'等等是傳遞給該方法的參數的類型,'first_param','second_param'等等是傳遞給該方法的實際變量和'firstPartOfMethodName:secondPartOfMethodName :...'是方法的名稱(或**簽名**)。 –

回答

36

1)該函數返回一個單元格的表視圖是?因此,返回的對象類型爲UITableViewCell。這些是您在表格行中看到的對象。這個函數基本上返回一個單元格,用於表格視圖。 但你可能會問,該功能將如何知道返回什麼細胞什麼行,這是在第二個問題

2)NSIndexPath回答實際上是兩個東西 -

  • 你的第
  • 你row

因爲您的表格可能會被劃分爲多個部分,並且每個部分都有自己的行,因此此NSIndexPath將幫助您精確識別哪個部分以及哪個行。他們都是整數。如果你是初學者,我會說只有一個部分。

如果在視圖控制器中實現了UITableViewDataSource協議,則會調用它。更簡單的方法是添加一個UITableViewController類。我強烈建議這樣做,因爲它爲您編寫了一些代碼,以便輕鬆實現可以描述表格的函數。無論如何,如果你選擇自己實現這個協議,你需要創建一個UITableViewCell對象並將其返回給任何行。看看它的類的引用來理解可重用性,因爲在表視圖中顯示的單元格被一次又一次地重複使用(這是一個非常有效的設計)。

至於當你有兩個表視圖,看看方法。表視圖被傳遞給它,所以你不應該有這方面的問題。

92

我會試着(從documention例子)把它分解

/* 
* The cellForRowAtIndexPath takes for argument the tableView (so if the same object 
* is delegate for several tableViews it can identify which one is asking for a cell), 
* and an indexPath which determines which row and section the cell is returned for. 
*/ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    /* 
    * This is an important bit, it asks the table view if it has any available cells 
    * already created which it is not using (if they are offScreen), so that it can 
    * reuse them (saving the time of alloc/init/load from xib a new cell). 
    * The identifier is there to differentiate between different types of cells 
    * (you can display different types of cells in the same table view) 
    */ 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

    /* 
    * If the cell is nil it means no cell was available for reuse and that we should 
    * create a new one. 
    */ 
    if (cell == nil) { 

     /* 
     * Actually create a new cell (with an identifier so that it can be dequeued). 
     */ 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; 

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    } 

    /* 
    * Now that we have a cell we can configure it to display the data corresponding to 
    * this row/section 
    */ 

    NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [item objectForKey:@"mainTitleKey"]; 
    cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; 
    UIImage *theImage = [UIImage imageWithContentsOfFile:path]; 
    cell.imageView.image = theImage; 

    /* Now that the cell is configured we return it to the table view so that it can display it */ 

    return cell; 

} 

這是一個DataSource方法,因此將在任何對象已宣佈自己爲UITableViewDataSource被調用。當表視圖實際需要在屏幕上顯示單元格時,會根據行和段的數量(您在其他DataSource方法中指定)調用它。

+0

既然這個線程提供了一個很好的交易信息,我想添加一些也可能有用的信息。如果您從部分代碼啓動重新加載,也會調用此方法。例如 - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation –

+0

不應該將'cell.selectionStyle = UITableViewCellSelectionStyleNone;'移出if塊嗎?當我把它放進去時,它不起作用。 –

5

基本上它是設計你的單元格,cellforrowatindexpath是爲每個單元格調用的,而單元格編號是通過indexpath.row和sectionpath通過indexpath.section找到的。在這裏,您可以使用標籤,按鈕或圖像化的圖像來更新表格中的所有行。 回答第二個問題 在對行單元格的索引路徑使用IF語句

在Objective C中

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

NSString *CellIdentifier = @"CellIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(tableView == firstTableView) 
    { 
     //code for first table view 
     [cell.contentView addSubview: someView]; 
    } 

    if(tableview == secondTableView) 
    { 
     //code for secondTableView 
     [cell.contentView addSubview: someView]; 
    } 
    return cell; 
} 

在雨燕3.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell! 

    if(tableView == firstTableView) { 
    //code for first table view 
    } 

    if(tableview == secondTableView)  { 
    //code for secondTableView 
    } 

    return cell 
} 
+0

你應該使用靜態的NSString * CellIdentifier = @「CellIdentifier」;這個委託是動態的,所以任何靜態都必須正確聲明。 – GeneCode

+0

但字符串不會改變它總是會在每次單元加載時都是「CellIdentifier」,而不是其他的單元格被重用,請糾正我,如果我錯了。 – Koushik

+0

該字符串不會更改,爲true。但是,自從委託人被調用很多次以來,它將被創建多次。使用靜態確保字符串被創建一次並被重用。 – GeneCode

相關問題