web-dev-qa-db-fra.com

iPhone: coche de l'accessoire de cellule TableView

Dans l'application iPhone, cliquez sur la cellule de la vue de table Je souhaite afficher la cellule de vue de table Type d'accessoire Cochez cette case sur didSelectRowAtIndexPath j'écris du code

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

et afficher des coches.

mais dans mon cas, je ne veux pas permettre à l'utilisateur de vérifier uniquement sur la cellule à la fois signifie que si l'utilisateur sélectionne une autre ligne, cette ligne doit être vérifiée et précédemment vérifiée doit être décochée

Comment puis-je y parvenir?

37
ios

Gardez une trace, dans une variable d'instance, de la ligne cochée. Lorsque l'utilisateur sélectionne une nouvelle ligne, décochez d'abord la ligne précédemment vérifiée, puis vérifiez la nouvelle ligne et mettez à jour la variable d'instance.

Voici plus de détails. Ajoutez d'abord une propriété pour garder une trace de la ligne actuellement cochée. C'est plus simple s'il s'agit d'un NSIndexPath.

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

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

@end

Dans votre cellForRowAtIndexPath ajoutez ce qui suit:

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

Comment vous codez votre tableView:didSelectRowAtIndexPath: dépendra du comportement que vous souhaitez. S'il doit toujours y avoir une ligne cochée, c'est-à-dire que si l'utilisateur clique sur une ligne déjà cochée, utilisez ce qui suit:

- (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;
}

Si vous souhaitez permettre à l'utilisateur de pouvoir décocher la ligne en cliquant à nouveau dessus, utilisez ce 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;  
}
}

Pour référence, jetez un œil à ceci discussion

5
visakh7

c'est une solution simple qui a fonctionné pour moi:

dans votre fichier .h, déclarez:

NSIndexPath *checkedCell;

puis dans votre fichier .m ajoutez:

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

à la méthode cellForRowAtIndexPath et

checkedCell = indexPath;
[tableView reloadData]

à la méthode didSelectRowAtIndexPath .

Bonne chance!

3
Johnny Rockex

c'est simple

en .h

NSIndexPath   checkedCell;

Dans M

cellForRowAtIndexPath


if ([checkedCell isEqual:indexPath]) 

{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;


} else
{ 
    cell.accessoryType = UITableViewCellAccessoryNone; 
}

dans didSelectRowAtIndexPath

checkedCell = indexPath;

[tableView reloadData]
2
Ramsakal

J'ai travaillé sur ton problème et j'ai trouvé une solution

dans le fichier .h

int rowNO;
    NSIndexPath *lastIndexPth;

dans . fichier m

- (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;
    }

J'espère que cela pourrait vous aider ...

2
Gypsa

Vous pouvez stocker NSIndexPath de la ligne vérifiée en tant que variable de classe, chaque fois que vous essayez sur la ligne des autres, accédez simplement à la ligne précédemment vérifiée à l'aide de la variable NSIndexPath stockée en tant que variable de classe et décochez-la.

Vérifiez le post ci-dessous

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

1
Jhaliya

Ajoutez à votre UITableViewDataSource variable de délégué NSIndexPath *checkedIndex. Ajouter à didSelectRowAtIndexPath:

checkedIndex = indexPath;
[tableView reload];

Et changez votre cellForRowAtIndexPath: méthode:

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

J'espère que celui-ci résout votre problème:

- (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
Jayprakash Dubey