Ich habe eine UItableview mit wiederordnbaren Zeilen und die Daten befinden sich in einem NSarray. Wie verschiebe ich ein Objekt im NSMutablearray, wenn der entsprechende Tableview-Delegat aufgerufen wird?
Eine andere Möglichkeit, dies zu fragen, besteht darin, ein NSMutableArray neu zu ordnen.
iphone
objective-c
nsarray
Jonathan.
quelle
quelle
Antworten:
id object = [[[self.array objectAtIndex:index] retain] autorelease]; [self.array removeObjectAtIndex:index]; [self.array insertObject:object atIndex:newIndex];
Das ist alles. Es ist wichtig, sich um die Anzahl der Aufbewahrungen zu kümmern, da möglicherweise nur das Array auf das Objekt verweist.
quelle
ARC-konforme Kategorie:
NSMutableArray + Convenience.h
@interface NSMutableArray (Convenience) - (void)moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex; @end
NSMutableArray + Convenience.m
@implementation NSMutableArray (Convenience) - (void)moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex { // Optional toIndex adjustment if you think toIndex refers to the position in the array before the move (as per Richard's comment) if (fromIndex < toIndex) { toIndex--; // Optional } id object = [self objectAtIndex:fromIndex]; [self removeObjectAtIndex:fromIndex]; [self insertObject:object atIndex:toIndex]; } @end
Verwendung:
[mutableArray moveObjectAtIndex:2 toIndex:5];
quelle
toIndex
wenn deinfromIndex
kleiner ist als deintoIndex
.[A,B,C]
nach einem AufrufmoveObjectAtIndex:0 toIndex:1
würde zu[A,B,C]
. Ist das logisch?remove
dekrementiert effektiv die Indizes aller Objekte nachfromIndex
.Mit Swift's ist
Array
es so einfach:Swift 3
extension Array { mutating func move(at oldIndex: Int, to newIndex: Int) { self.insert(self.remove(at: oldIndex), at: newIndex) } }
Swift 2
quelle
Wenn Sie eine haben
NSArray
, können Sie nichts verschieben oder neu anordnen, da es unveränderlich ist.Du brauchst eine
NSMutableArray
. Damit können Sie Objekte hinzufügen und ersetzen, was natürlich auch bedeutet, dass Sie das Array neu anordnen können.quelle
Das kannst du nicht.
NSArray
ist unveränderlich. Sie können dieses Array in ein Array kopierenNSMutableArray
(oder es zuerst verwenden). Die veränderbare Version verfügt über Methoden zum Verschieben und Austauschen ihrer Elemente.quelle
-exchangeObjectAtIndex:withObjectAtIndex:
. Auch die verschiedenen Sortiermethoden.Ich denke, wenn ich richtig verstehe, können Sie Folgendes tun:
- (void) tableView: (UITableView*) tableView moveRowAtIndexPath: (NSIndexPath*)fromIndexPath toIndexPath: (NSIndexPath*) toIndexPath { [self.yourMutableArray moveRowAtIndex: fromIndexPath.row toIndex: toIndexPath.row]; //category method on NSMutableArray to handle the move }
Anschließend können Sie NSMutableArray mit der Methode - insertObject: atIndex: eine Kategoriemethode hinzufügen, um die Verschiebung zu handhaben.
quelle
Ähnlich wie Tomasz, jedoch mit Fehlerbehandlung außerhalb des Bereichs
enum ArrayError: ErrorType { case OutOfRange } extension Array { mutating func move(fromIndex fromIndex: Int, toIndex: Int) throws { if toIndex >= count || toIndex < 0 { throw ArrayError.OutOfRange } insert(removeAtIndex(fromIndex), atIndex: toIndex) } }
quelle