it-swarm.com.de

iPhone: TableView-Häkchen für Zellzubehör

In der iPhone App möchte ich beim Klicken auf die Tabellenzelle die Tabellenzelle anzeigen

if(indexPath.row ==0)
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
 }

und Anzeigen von Häkchen.

aber in meinem Fall möchte ich nicht zulassen, dass der Benutzer immer nur die Zellen gleichzeitig überprüft, wenn der Benutzer eine andere Zeile auswählt, sollte diese Zeile überprüft und zuvor überprüft deaktiviert werden

Wie kann ich das erreichen?

37
ios

Verfolgen Sie in einer Instanzvariablen, welche Zeile markiert ist. Wenn der Benutzer eine neue Zeile auswählt, deaktivieren Sie zuerst die zuvor aktivierte Zeile, überprüfen Sie dann die neue Zeile und aktualisieren Sie die Instanzvariable.

Hier ist mehr Detail. Fügen Sie zunächst eine Eigenschaft hinzu, um die aktuell aktivierte Zeile zu verfolgen. Es ist am einfachsten, wenn dies ein NSIndexPath ist.

@interface RootViewController : UITableViewController {
    ...
    NSIndexPath* checkedIndexPath;
    ...
}

...
@property (nonatomic, retain) NSIndexPath* checkedIndexPath;
...

@end

Fügen Sie in Ihrem cellForRowAtIndexPath Folgendes hinzu:

if([self.checkedIndexPath isEqual:indexPath])
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else 
{
    cell.accessoryType = UITableViewCellAccessoryNone;
}

Wie Sie Ihren tableView:didSelectRowAtIndexPath: Codieren, hängt vom gewünschten Verhalten ab. Wenn immer eine Zeile markiert sein muss, das heißt, wenn der Benutzer auf eine bereits markierte Zeile klickt, gehen Sie folgendermaßen vor:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Uncheck the previous checked row
    if(self.checkedIndexPath)
    {
        UITableViewCell* uncheckCell = [tableView
                     cellForRowAtIndexPath:self.checkedIndexPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
    }
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    self.checkedIndexPath = indexPath;
}

Wenn Sie möchten, dass der Benutzer die Zeile durch erneutes Klicken deaktivieren kann, verwenden Sie diesen Code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Uncheck the previous checked row
    if(self.checkedIndexPath)
    {
        UITableViewCell* uncheckCell = [tableView
                    cellForRowAtIndexPath:self.checkedIndexPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
    }
    if([self.checkedIndexPath isEqual:indexPath])
    {
        self.checkedIndexPath = nil;
    }
    else
    {
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        self.checkedIndexPath = indexPath;
    }
}
169
idz
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *newCell =[tableView cellForRowAtIndexPath:indexPath];
int newRow = [indexPath row];
int oldRow = [lastIndexPath row];
if (newRow != oldRow)
{
    newCell = [tableView  cellForRowAtIndexPath:indexPath];
    newCell.accessoryType = UITableViewCellAccessoryCheckmark;
    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone;
    lastIndexPath = indexPath;  
}
}

Als Referenz schauen Sie sich das an Diskussion

5
visakh7

dies ist eine einfache Lösung, die für mich funktioniert hat:

in deiner .h Datei deklariere:

NSIndexPath *checkedCell;

dann fügen Sie in Ihrer .m-Datei Folgendes hinzu:

        if (checkedCell == indexPath) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else { 
cell.accessoryType = UITableViewCellAccessoryNone; 
}

zur cellForRowAtIndexPath Methode und

checkedCell = indexPath;
[tableView reloadData]

zur Methode didSelectRowAtIndexPath .

Viel Glück!

3
Johnny Rockex

es ist einfach

in .h

NSIndexPath   checkedCell;

In .m

cellForRowAtIndexPath


if ([checkedCell isEqual:indexPath]) 

{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;


} else
{ 
    cell.accessoryType = UITableViewCellAccessoryNone; 
}

in didSelectRowAtIndexPath

checkedCell = indexPath;

[tableView reloadData]
2
Ramsakal

Ich habe an Ihrem Problem gearbeitet und eine Lösung gefunden

in .h Datei

int rowNO;
    NSIndexPath *lastIndexPth;

im . m Datei

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%d",indexPath.row);
    if (rowNO!=indexPath.row) {
        rowNO=indexPath.row;        
        [tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
        [tableView cellForRowAtIndexPath:lastIndexPth].accessoryType=UITableViewCellAccessoryNone;
        lastIndexPth=indexPath;
    }

Ich hoffe das könnte dir helfen ...

2
Gypsa

Sie können NSIndexPath der markierten Zeile als Klassenvariable speichern, wenn Sie versuchen, in die andere Zeile zu gelangen, greifen Sie einfach mit der als Klassenvariable gespeicherten NSIndexPath -Variable auf die zuvor markierte Zeile zu und deaktivieren Sie diese.

Überprüfen Sie den folgenden Beitrag

http://www.iphonedevsdk.com/forum/iphone-sdk-development/24240-geeigneteAnsichtZubehörcheckmark-one-checkmark-time.html

1
Jhaliya

Fügen Sie Ihrer UITableViewDataSource Delegatenvariablen NSIndexPath *checkedIndex Hinzu. Zu didSelectRowAtIndexPath: Hinzufügen

checkedIndex = indexPath;
[tableView reload];

Und ändern Sie Ihre cellForRowAtIndexPath: - Methode:

cell = .. // init or dequeue
if ([indexPath isEqualTo:checkedIndex])
{
    cell.accessoryType=UITableViewCellAccessoryCheckmark;
}
else
{
    cell.accessoryType=UITableViewCellAccessoryNone;
}
1
5hrp

Ich hoffe dieser löst dein Problem:

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

int newRow = [indexPath row];
int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;

if (newRow != oldRow)
{
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:
                                indexPath];
    newCell.accessoryType = UITableViewCellAccessoryCheckmark;

    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: 
                                lastIndexPath]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone;
    lastIndexPath = indexPath;
}

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
1