By the way, the pseudo code I wrote does work…


        NSIndexSet * draggedIndexes = ...;
        NSMutableArray * newThings = [[self.things mutableCopy] autorelease];
        NSArray * draggedObjects = [self.things 
objectsAtIndexes:draggedIndexes];
        NSInteger numberOfRows = tableView.numberOfRows;
        NSInteger dropIndex = row;
        
        while ([draggedIndexes containsIndex:dropIndex] && dropIndex < 
numberOfRows) dropIndex++;
        id beforeObject = (dropIndex == numberOfRows ? nil : [self.things 
objectAtIndex:dropIndex]);
        
        [tableView beginUpdates];
                
        for (id draggedObject in draggedObjects) {
                NSInteger from = [newThings indexOfObject:draggedObject];
                NSInteger to = (beforeObject ? [newThings 
indexOfObject:beforeObject] : numberOfRows);
                
                to -= (to > from);
                [tableView moveRowAtIndex:from toIndex:to];
                [newThings removeObjectAtIndex:from];
                
                if (to == newThings.count) {
                        [newThings addObject:draggedObject];
                } else {
                        [newThings insertObject:draggedObject atIndex:to];
                }
        }
                
        self.things = newThings;
        [tableView endUpdates];



I then modified it to be index-only based:


        NSIndexSet * draggedIndexes = ...;
        NSMutableArray * newThings = [[self.things mutableCopy] autorelease];
        NSInteger numberOfRows = tableView.numberOfRows;
        NSInteger dropIndex = row;
        
        while ([draggedIndexes containsIndex:dropIndex] && dropIndex < 
numberOfRows) dropIndex++;
        
        [tableView beginUpdates];
        
        NSInteger offsetForIndexesBefore = 0;
        NSInteger offsetForIndexesAfter = 0;
        NSUInteger initialDraggedIndex = [draggedIndexes firstIndex];
        while (initialDraggedIndex != NSNotFound) {
                NSInteger from = initialDraggedIndex;
                NSInteger to = dropIndex;
                id draggedObject = nil;
                
                if (initialDraggedIndex < dropIndex) {
                        from += offsetForIndexesBefore;
                        offsetForIndexesBefore--;
                }
                
                to -= (to > from);
                
                if (initialDraggedIndex >= dropIndex) {
                        to += offsetForIndexesAfter;
                        offsetForIndexesAfter++;
                }
                
                draggedObject = [[newThings objectAtIndex:from] retain];
                [tableView moveRowAtIndex:from toIndex:to];
                [newThings removeObjectAtIndex:from];
                
                if (to == newThings.count) {
                        [newThings addObject:draggedObject];
                } else {
                        [newThings insertObject:draggedObject atIndex:to];
                }
                
                [draggedObject release];
                initialDraggedIndex = [draggedIndexes 
indexGreaterThanIndex:initialDraggedIndex];
        }
        
        
        self.things = newThings;
        [tableView endUpdates];



Sample project:
http://www.sethwillits.com/temp/TableViewReorder.zip




--
Seth Willits


_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to