La différence entre NSIndexSet et NSArray c'est quoi au juste...
Gercofis
Membre
Beaucoup mal a comprendre le sens de NSIndexSet
J'ai lu un peu tout sur ce sujet...
J'en ai déduit que NSIndexSet est une suite/tableau d'index pointant sur les lignes d'un tableau.
Un exemple montrant un parallèle entre l'un et l'autre ?
J'ai lu un peu tout sur ce sujet...
J'en ai déduit que NSIndexSet est une suite/tableau d'index pointant sur les lignes d'un tableau.
Un exemple montrant un parallèle entre l'un et l'autre ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le code suivant sélectionnera dans ta tableview 5 lignes à partir de la 3e ligne :
[tt]
[maTableView selectRowIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3,5)] byExtendingSelection:YES];
[/tt]
Les utilisations sont multiples, dans un cas pratique tu peux vouloir par exemple récupérer tout les objets de ton modèle, par exemple des objets dans un NSMutableArray, qui sont associés à la sélection de ta tableview. La méthode selectedRowIndexes te donne l'index de la sélection, ensuite tu peux récupérer un array des objets en rapport avec la sélection avec la méthode objectsAtIndexes.
La seule indication que je puisse te donner, c'est que le setData attend une NSData, qu'il faut générer en allant chercher dans ta couche modèle les données correspondant à l'index du NSIndexSet fourni.
[EDIT]
Bon, j'ai regardé un peu à quoi ressemble le code de drag de l'exemple Bookmarks.
[tt]
// create new array of selected rows for remote drop
// could do deferred provision, but keep it direct for clarity
NSMutableArray *rowCopies = [NSMutableArray arrayWithCapacity:[rows count]];
NSEnumerator *rowEnumerator = [rows objectEnumerator];
NSNumber *idx;
while (idx = [rowEnumerator nextObject])
{
[rowCopies addObject:self arrangedObjects] objectAtIndex:[idx intValue];
}
// setPropertyList works here because we're using dictionaries, strings,
// and dates; otherwise, archive collection to NSData...
[pboard setPropertyList:rowCopies forType:CopiedRowsType];
return YES;
[/tt]
Je pense qu'il faut que tu fasses quelque chose dans le genre en allant chercher les objets concernés par le NSIndexSet via ton NSManagedObject.
Donc si j'ai bien compris, sa ne donne pas le id d'un objet mais juste sa position relative dans un tableau ou une liste.
Un indexSet peut par exemple être composé des indexes {2,3,6,8}, et si tu utilises cet NSIndexSet sur un tableau T pour lui demander les objets à ces indexes, il te retournera le sous-tableau S composé du 2e, 3e, 6e et 8e élément du tableau T.
Comme tout ensemble (Set) qui se respecte, il ne peut contenir qu'une seule fois chaque index (on ne peut pas avoir deux fois l'index 3 par exemple)
- [tt]initWithIndexes:0,0[/tt] = [tt]initWithIndexes:0,nil[/tt] = indexSet avec l'index 0 uniquement
- [tt]initWithIndexes:1,0[/tt] = [tt]initWithIndexes:1,nil[/tt] = indexSet avec l'index 1 uniquement
- [tt]initWithIndexes:0,2,0[/tt] = [tt]initWithIndexes:0,2,nil[/tt] = indexSet avec les indexes 0 et 2.
- [tt]initWithIndexes:2,0,3,nil[/tt] = [tt]initWithIndexes:2,nil,3,nil[/tt] = [tt]initWithIndexes:2,nil[/tt] = indexSet avec l'index 2 uniquement (piège) !
Mais bon ça permet en une seule ligne de créer un NSIndexSet avec plein d'index dedans (je suis étonné qu'il n'y ait pas déjà une méthode du genre d'ailleurs), et cette petite limitation d'être obligé de mettre l'index 0 en premier si on souhaite que l'indexSet le contienne n'est pas embêtante puisqu'un NSIndexSet n'est pas ordonné.
Sinon pour ta question sur le réarrangement des éléments, ce n'est pas si simple, parce qu'un NSIndexSet est un set = un ensemble. Donc par définition un ensemble n'a non seulement que des éléments uniques, mais n'a pas non plus de notion d'ordre entre ses éléments.
Autrement dit un NSIndexSet avec les éléments {2,3,5,6} et un set avec les éléments {3,6,5,2} sont les mêmes ensembles.
D'ailleurs fais gaffe à ton vocabulaire pour ne pas tout confondre : "créer des sets arrangés différemment" ça n'a justement pas de sens... parce qu'un set (un ensemble) ne peut être arrangé, par définition, ses éléments n'ayant pas d'ordre. Un NSArray par contre, non seulement peut contenir des éléments en doublon, mais est de plus ordonné. C'est pour ça que tu vois des méthodes comme [tt]- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2[/tt] dans la doc de NSMutableArray