У меня есть два экрана NSTableViews на экране; Я просто хочу перетащить строку из одной таблицы в другую таблицу. Я вижу много советов здесь и там, но я не вижу полного примера, и я немного смущен. Я видел examples, которые были совершенно разными для примеров приложений для яблок TableView playground и drag and drop outlineView.Как реализовать перетаскивание с NSOutlineVIew
Я решил использовать метод Яблок, но теперь я застрял. Настольная площадка TableView реализует эти методы в своем модельном объекте.
- (NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard
- (id)pasteboardPropertyListForType:(NSString *)type
- (NSPasteboardWritingOptions)writingOptionsForType:(NSString *)type pasteboard:(NSPasteboard *)pasteboard
Я не понимаю, как их установить. Для 1-го метода я вернул массив со строкой @"com.mycompany.myapp.mypasteboardtype"
, как предложено в this вопрос.
Что я должен поставить для второго метода? Моя модель - это настраиваемый объект с несколькими строками, массивами и переменными словаря. Я также не понимаю третий метод. Хотелось бы, чтобы появился какой-то пример, который я видел, что делает простое перетаскивание из одной таблицы в другую с помощью настраиваемого объекта модели.
EDIT: Моя реализация на основе ответа ниже
-(id)pasteboardPropertyListForType:(NSString *)type {
return [NSKeyedArchiver archivedDataWithRootObject:self];
}
-(NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard {
return [NSArray arrayWithObject:myDragType];
}
// Other methods that need to be implemented
-(id)initWithPasteboardPropertyList:(id)propertyList ofType:(NSString *)type {
return [NSKeyedUnarchiver unarchiveObjectWithData:propertyList];
}
+(NSArray *)readableTypesForPasteboard:(NSPasteboard *)pasteboard {
return [NSArray arrayWithObject:myDragType];
}
// And finally your object needs comply with NSCoder protocol. These following 2 methods needs to go in the object model associated with a row.
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:oneOfMyIvarsToEncode forKey:@"someKey"];
}
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
oneOfMyEndodedIvars = [aDecoder decodeObjectForKey:@"someKey"];
}
return self;
}
Хорошо. один окончательный вопрос о том, что касается 'pasteboardPropertyListForType:', вы сказали, что я могу возвращать любой тип, пока его список свойств. В примерах TableViewPlaygorund они вернули 'self'. Если я попытаюсь вернуть любой другой объект, отличный от self, я получаю предупреждение @ «Несовместимые типы указателей ..», это может вызвать проблемы? –
@Jai: Какой класс в этом образце вы смотрите? –
Ничего. Кажется, я решил это. Я буду отмечать этот ответ так же корректно, как я получил информацию этого ответа плюс от другого вопроса, на который вы ответили, прежде чем ----> http://stackoverflow.com/questions/7243668/nspasteboard-and-simple-custom-data –