У меня есть собственный класс, который соответствует протоколу NSCoding. Ниже показано, как я реализую методы протокола.
User.swift
required init?(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObject(forKey: #keyPath(name)) as! String
self.age = aDecoder.decodeInteger(forKey: #keyPath(age))
}
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: #keyPath(name))
aCoder.encode(age, forKey: #keyPath(age))
}
Я установил параметры чтения:
static func readingOptions(forType type: String, pasteboard: NSPasteboard) -> NSPasteboardReadingOptions {
return .asKeyedArchive
}
Этот объект будет помещаться внутрь NSDragPboard
всякий раз, когда пользователь перетаскивает строку ячейки на NSOutlineView
. Вы можете увидеть реализацию ниже:
UserViewController.h
var users: User // Store the users to be used in the outlineView
.
.
.
func outlineView(_ outlineView: NSOutlineView, writeItems items: [Any], to pasteboard: NSPasteboard) -> Bool {
if let user = items.first as? User {
pasteboard.clearContents()
pasteboard.writeObjects([user])
return true
}
return false
}
После того, как пользователь закончит перетаскивание, отпустив кнопку мыши, приложение получит содержимое монтажного стола, выполнив следующие действия:
func outlineView(_ outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool {
let pasteboard = info.draggingPasteboard()
if let userInPasteboard = pasteboard.readObjects(forClasses: [User.self], options: nil)?.first as? User {
// We can access the user in pasteboard here
}
}
Но проблема в том, что данные из картона имеют другой адрес памяти, чем данные в layoutView.
Если мы попытаемся найти пользователя в layoutView, используя пользователя из pasteBoard, мы не сможем его найти.
for user in self.users {
if user == userInPasteboard {
print("We found the user that was placed on pasteboard") // Never executed
}
}
Я могу реализовать протокол Equatable
для класса User. Но я думаю, что если каким-то образом мы сможем сделать так, чтобы объект, считываемый с монтажного стола, имел тот же адрес указателя, что и объект, записанный на монтажный стол, это сработало бы.
Ниже приведено то, чего я пытаюсь достичь:
Можно ли этого достичь? Как?
user == userInPasteboard
? Вы хотите изменить порядок внутри того же вида схемы? - person Willeke   schedule 27.07.2017NSOutlineView
делает это внутри, но я никогда не находил это необходимым в своих источниках данных. Кроме того, если ваше приложение может добавлять элементы в представление схемы независимо от пользовательского ввода (как некоторые из моих делают на основе сетевых событий), то пути индекса нестабильны и, следовательно, не могут надежно идентифицировать перетаскиваемые элементы. - person rob mayoff   schedule 27.07.2017full path
как/Projects/App/hello-world
. Если у меня есть представление структуры с глубиной 5, и я хочу переместить элемент между деревьями, я никак не могу сохранить ссылку на этот элемент, используя только пути индекса. По этой причине я думаю, что передача индексных путей вNSPasteboard
не является хорошим решением. - person Edward Anthony   schedule 27.07.2017