調整可能な行を持つUItableviewがあり、データはNSarrayにあります。適切なTableViewデリゲートが呼び出されたときにNSMutablearray内のオブジェクトを移動するにはどうすればよいですか?
これを尋ねる別の方法は、NSMutableArrayを並べ替える方法ですか?
id object = [[[self.array objectAtIndex:index] retain] autorelease];
[self.array removeObjectAtIndex:index];
[self.array insertObject:object atIndex:newIndex];
それで全部です。保持カウントはオブジェクトを参照する唯一の配列である可能性があるため、保持カウントの管理は重要です。
ARC準拠カテゴリ:
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
使用法:
[mutableArray moveObjectAtIndex:2 toIndex:5];
SwiftのArray
を使用すると、次のように簡単になります。
extension Array {
mutating func move(at oldIndex: Int, to newIndex: Int) {
self.insert(self.remove(at: oldIndex), at: newIndex)
}
}
extension Array {
mutating func moveItem(fromIndex oldIndex: Index, toIndex newIndex: Index) {
insert(removeAtIndex(oldIndex), atIndex: newIndex)
}
}
NSArray
がある場合、不変であるため、移動や並べ替えはできません。
NSMutableArray
が必要です。これにより、オブジェクトを追加および置換できます。もちろん、配列の順序を変更することもできます。
できません。 NSArray
は不変です。その配列を NSMutableArray
にコピーできます(または最初に使用します)。可変バージョンには、アイテムを移動および交換するメソッドがあります。
正しく理解できれば、次のことができると思います。
- (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
}
次に、insertObject:atIndex:メソッドを使用して移動を処理するNSMutableArrayにカテゴリメソッドを追加します。
Tomaszに似ていますが、範囲外のエラー処理があります
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)
}
}