2010-02-25 134 views
0

我遇到了一些問題。通常,在處理UITableView時,我將構建一個特殊的 方法,configureCell,它構建tableView需要的單元格。因此cellForRowAtIndexPath查詢configureCell以獲取新的單元格,如果在緩存中找不到任何單元格的話。具有單個自定義單元格的UITableView? (iPhone)

在這種獲取運行用戶每次滾動的cellForRowAtIndexPath部分:

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
     static NSString *CellIdentifier = @"Cell"; 

     UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) {  
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
      [self configureCell:cell atIndexPath:indexPath]; 
     } 
//this part is always executed! 
} 

我從我的模型設定的標籤值等。這工作正常,我相信,這應該是如何正確工作,並在CPU上最小的壓力。從我可以在TableView指南中讀到的內容。

我現在的問題是,我的tableView中的第一個單元格與其他單元格不同。我有一個特殊的圖標和其他東西,將它與其他單元格分開。

在我的配置單元的然後我試着問:

if (indexPath.row == 0) { 

    //do special setup! 

} 

這是一個壞主意,因爲的tableView延遲加載的細胞,因此是關閉屏幕的第一個單元格,當被滾動屏幕上,也會得到indexPath.row = 0,所以現在我每7個電池就有一個「特殊電池」。 我該如何解決這個問題?

第二個問題也源於上述:我有一個定製UIView放置在所有單元格accessoryView。當用戶點擊一個「編輯」按鈕時,附件視圖的所有單元應該改變爲表示我們處於「編輯模式」的圖標。在這裏,再一次,這隻發生在屏幕上的單元格,當滾動「舊」單元或者從緩存中取出時,或者構建了不知道我們處於編輯模式的新單元時。

當您點擊一個單元格時,單元格的indexPath.row毫無疑問會被點擊,您需要將該索引與您的模型數組配對以找出用戶點擊的內容。但是,當TableView操縱單元格時(將它們拉到屏幕上,脫離屏幕,刪除,添加),似乎應用了不同的規則。

我猜,我在問;爲了遵循最佳實踐並且不打擊SDK,我應該怎樣做才能獲得所需的功能以及在Cell生命週期的哪個階段應該應用這種邏輯?

希望有人能指導我在正確的方向:)謝謝提前:)

+0

你使用了什麼TableViewController風格? – 2010-02-25 20:43:05

+0

Ahh在那裏看不到你的問題Rob。 這是一個UITableView,我手動添加到UIViewController。它不使用部分。 像這樣:self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease]; 這是否回答你的問題? – RickiG 2010-02-25 22:06:42

+0

只是將其更改爲: \t self.tableView = [[[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain] autorelease]; 可以肯定:) – RickiG 2010-02-25 22:19:24

回答

1

我認爲問題不在於第一關屏小區在indexPath.row = 0。 問題是您正在使用相同的CellIdentifier常規和自定義單元格。所以當TableView去出隊一個緩存的單元格時,它有時會抓住你的自定義單元格,它有圖標。

既然你給它的CellIdentifier和你的常規單元格一樣,它並不知道它們是不一樣的。

像這樣的東西應該修復它:

static NSString *CellIdentifier; 
if([indexPath row] == 0){ 
    CellIdentifier = @"CustomCell"; 
} else { 
    CellIdentifier = @"Cell"; 
} 

我不知道你的編輯按鈕的問題,但它可能是相關的。

+0

是的,在回顧過程中,我也很確定發生了什麼。 if(indexPath.row == 0)的方法是正確的。爲第一行構建自定義單元格並使用不同的標識符是正確的選擇。 – RickiG 2011-03-12 10:35:03