2010-03-16 54 views
0

我有一個UITableView,有些單元格在視圖初始化時用UITableViewCellAccessoryCheckmark標記。UITableViewCell:如何驗證所有單元中的accessoryType類型?

當用戶選擇另一行時,我必須檢查之前是否達到了所選行的最大數量。要做到這一點,我使用的代碼波紋管:

- (NSInteger)tableView:(UITableView *)tableView numberOfSelectedRowsInSection:(NSInteger)section{ 

NSInteger numberOfRows   = [self tableView:tableView numberOfRowsInSection:section]; 
NSInteger numberOfSelectedRows = 0; 

for (int i = 0; i < numberOfRows; i++) { 

    UITableViewCell *otherCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:section]]; 

    if (otherCell.accessoryType == UITableViewCellAccessoryCheckmark) { 
    numberOfSelectedRows++; 
    } 
} 

return numberOfSelectedRows; 

} 

如果我的行數,爲例,20,變量numberOfRows正確與20設置好的比方說,有13個行已經標有UITableViewCellAccessoryCheckmark。因此,numberOfSelectedRows在循環之後應該爲13,但只考慮標記的和可選的單元格。因此,如果我顯示了9個單元格並標記了7個單元格,則numberOfSelectedRows會返回7而不是13(但按預期爲迭代20次)。

這是UITableView的正確行爲,還是iPhone模擬器的錯誤?

在此先感謝。

回答

1

這是正確的行爲。 UITableView不是列表。系統緩存屏幕外的單元以節省內存和CPU,並且無法以有意義的方式迭代它們。好吧,你應該跟蹤模型/數據,tableView會跟蹤顯示它。我有這方面的一些問題,直到我接受了uitableView不是一個列表:)

因此,有一個對象的數組,每個對應於單元格中的數據。在構建單個細胞是這樣的:

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

    static NSString *CellIdentifier = @"categoryCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    Item *item = [self.itemList objectAtIndex:indexPath.row]; 

    [cell.textLabel setText:[item itemBrand]]; //notice that here we set the cell values 

    return cell; 
} 

的,當用戶點擊你改變你的模型是這樣的:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSLog(@"IndexPat.row%i", indexPath.row); 
    Item item = (Item*) [self.itemList objectAtIndex:indexPath.row]; 
    //change the state of item 
} 

這種方式的tableView將更新爲類似於模型/數據,你只是管理該模型。

2

是的,它按設計工作。你不應該在你的視圖中存儲模型數據。 UITableView對數據一無所知,它只顯示單元格(並且一旦滾動屏幕就立即拋出它們)。您需要將每個單元格的複選標記狀態存儲在模型對象(例如數組)中,然後您可以從視圖控制器訪問它們。

相關問題