2010-05-09 18 views
46

Bin ich richtig, dass in der Annahme, das Häkchen für „on“ auf „off“ zu ändern, muss ich die CellAccessoryType zwischen none und checkmark auf dem didSelectRowAtIndexPath ändern?UITableViewCell Häkchen Änderung bei der Auswahl der

Weil ich dies getan habe, aber ich habe bemerkt, das Verhalten ist nicht perfekt identisch mit den Häkchen Zellen auf den Auto Lock-Einstellungen auf dem iPhone.

Oder gibt es eine andere Möglichkeit, die Häkchen zu behandeln?

Antwort

70
  1. eine Eigenschaft in Ihrem View-Controller halten selectedRow, genannt, die den Index einer Zeile darstellt, die die geprüfte Artikel in einem Tabellenabschnitt darstellt.

  2. Ihrer Ansicht -tableView:cellForRowAtIndexPath: Delegatmethode des Controllers, stellen Sie die accessoryType des cell-UITableViewCellAccessoryCheckmark, wenn die Zelle indexPath.row den selectedRow Wert entspricht. Andernfalls setzen Sie es auf UITableViewCellAccessoryNone.

  3. Ihrer Ansicht -tableView:didSelectRowAtIndexPath: Delegatmethode des Controllers, stellen Sie den selectedRow Wert auf den indexPath.row, der ausgewählt wird, zB: self.selectedRow = indexPath.row

+0

Sorry, ich meine nicht, dass ich (mehr wie Radio-Buttons) mehrere Häkchen Zellen hatten. Nur animierten sie nicht so reibungslos (aber ich habe das jetzt behoben). Aber Ihre Antwort bedeutet, dass ich die richtigen Methoden verwende :) –

+7

Um Alex Lösung hinzuzufügen - um das Häkchen erscheinen zu lassen, wenn Sie auf die Zelle tippen, müssen Sie auch [tableview reloadData] eingeben, nachdem Sie die ausgewählte Zelle gesetzt haben. –

+6

Das ist einfach, aber es kann zu Leistungseinbußen kommen, wenn Daten in die gesamte Tabelle neu geladen werden. Da Sie wissen, was 'indexPath.row' Sie aktualisieren müssen, müssen Sie nur diese Zeile aktualisieren, was mit der Tabellensichtmethode' -reloadRowsAtIndexPaths: withRowAnimation möglich ist: 'Für weitere Details: http://developer.apple. com/library/ios/dokumentation/UIKit/Referenz/UITableView_Class/Reference/Reference.html # // Apple_ref/doc/uid/TP40006943-CH3-SW40 –

3

Es

didHighlightRowAtIndexPath sollte

anstelle von

Tableview: DidSelectRowAtIndexPath

3

Alex Antwort für mich funktionierte nur nach dem Neuladen Tabelle hinzufügen, in .h

{ 
    int selectedCell; 
} 
@property(nonatomic,readwrite)int selectedCell; 

in .m * cellForRowAtIndexPath *

if(indexPath.row == selectedCell) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     cell.selected = YES; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.selected = NO; 
    } 

und in überall didHighlightRowAtIndexPath oder DidSelectRowAtIndexPath

self.selectedCell = indexPath.row; 
    [self.tableView reloadData]; 
56

Eine andere Lösung:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSIndexPath *oldIndex = [self.tableView indexPathForSelectedRow]; 
    [self.tableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone; 
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark; 
    return indexPath; 
} 

Und ja: Sie müssen nicht überprüfen, ob oldIndex ist nil :)


Swift 3 und später:

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 
    if let oldIndex = tableView.indexPathForSelectedRow { 
     tableView.cellForRow(at: oldIndex)?.accessoryType = .none 
    } 
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark 

    return indexPath 
} 
+0

Gute Antwort! +1 – BigSauce

+1

+1 für kurze Antwort –

+1

Dies ist wirklich ein großartiger Code. Ich habe die Swift-Version hinzugefügt. –

4

Zyphrax schlug eine großartige Lösung vor, die für mich gut funktionierte!Und wenn Sie die vorherigen ausgewählten Zeile löschen müssen, nur verwenden:

[self.tableView reloadData]; 

in

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

Wenn Sie Ihr eigenes Bild als accessoryType Verwendung Code unten verwenden möchten

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIImageView *imgCheckMark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"select_icon.png"]]; 
    [imgCheckMark setFrame:CGRectMake(self.view.frame.size.width - 30, 25, 14, 18)]; 
    imgCheckMark.tag = 1000+indexPath.row; 

    NSIndexPath *oldIndex = [self.tblSelectService indexPathForSelectedRow]; 
    [self.tblSelectService cellForRowAtIndexPath:oldIndex].accessoryView = UITableViewCellAccessoryNone; 
    [self.tblSelectService cellForRowAtIndexPath:indexPath].accessoryView = imgCheckMark; 
    return indexPath; 
} 
2

swift:

var selectedCell:UITableViewCell?{ 
    willSet{ 
     selectedCell?.accessoryType = .None 
     newValue?.accessoryType = .Checkmark 
    } 
} 

dann:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    selectedCell = self.tableView.cellForRowAtIndexPath(indexPath) 
    self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true) 
} 
+1

Große Lösung ... –

+0

Ausgezeichnete Annäherung an das Problem. Vielen Dank! – oyalhi

Verwandte Themen