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?
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;
}
}
- (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
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!
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]
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 ...
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
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;
}
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];
}