2010-09-04 50 views
3

我在創建UITableView中的CheckMarkAccessoryView時遇到了問題。當我在表中選擇一行時,我可以得到該行的選中標記,但隨機表中的其他一些行也會得到複選標記。我只需要那個單元格就可以得到複選標記。我可以怎麼做?我正在編寫一個獨佔列表。以下是我用過的代碼。iPhone的UITableViewCellAccessoryCheckMark

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(tableView==tableView1) 
    { 
     return […arraycount1…. ]; 
    } 
    else 
    { 
     return […arraycount2…. ]; 
    } 
} 

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

    static NSString *CellIdentifier = @"Cell"; 

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    else 
    { 
     UIView* subview; 
     while ((subview = [[[cell contentView] subviews] lastObject]) != nil) 
      [subview removeFromSuperview]; 
    } 

    if(tableView == tableView1) 
    { 
     cell.textLabel.text=[array1 objectAtIndex:indexPath.row]; 
    } 
    else     //Tableview2 
    { 
     cell.textLabel.text=[array2 objectAtIndex:indexPath.row];  
    } 

    cell.textLabel.font=[UIFont fontWithName:@"Georgia" size:20]; 
    cell.textLabel.textAlignment=UITextAlignmentLeft; 
    [cell setSelectedBackgroundView:border];  
    return cell; 

} 

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

    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:lastindex]; 
    if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark); 
    { 
     oldCell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];  

    if (newCell.accessoryType == UITableViewCellAccessoryNone) 
    { 
     newCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
} 

請問我在哪裏錯了。 在此先感謝所有的專家。

回答

2

兩個if語句相互抵消,只需添加其他類似如下:

UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:lastindex]; 
if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark) 
{ 
    oldCell.accessoryType = UITableViewCellAccessoryNone; 
} 
else 
{ 
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];  

    if (newCell.accessoryType == UITableViewCellAccessoryNone) 
    { 
     newCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
} 
3

的UITableView重用小區對象爲您滾動表,所以設置單元格以顯示一個勾號意味着它也將有重複使用時的複選標記

您需要將每行的狀態存儲在與單元格分開的數組中(或者如果您每次只需要一個單元格進行檢查,只需將索引存儲在某處),然後從中讀取數組並在cellForRowAtIndexPath:方法中設置適當的accessoryType

(或者你可以簡單地通過刪除dequeueReusableCellWithIdentifier:呼叫禁止小區重用,但是這是很糟糕的表現,如果你有很長的列表中滾動)

4
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    for (id algoPath in [tableView indexPathsForVisibleRows]) 
    { 
     UITableViewCell *cell = [tableView cellForRowAtIndexPath:algoPath]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 

     if(algoPath == indexPath) 
     { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
    } 
} 

我嘗試不同的東西出來,沒有什麼工作正常。現在我遍歷所有索引,將所有附件設置爲無,然後將當前附件設置爲accessoryCheckmark。不是最乾淨的方法,但工作。

1

我認爲你正在尋找這些方法!

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section!=0) { 
     [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
} 

//didDeselect method in table view for removing previous checkmark 

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section!=0) 
    { 
     [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone; 
    } 

} 
相關問題