NSTableView e NSOutlineView drag-and-drop
-
19-08-2019 - |
Pergunta
Eu tenho um NSTableView e um NSOutlineView, ambos com seu conteúdo fornecido por ligações, que eu gostaria de ter alguma funcionalidade de arrastar-e-soltar:
-
linhas de arrasto da Tabela Um em uma fileira de Contorno B, onde eles serão copiados para uma estrutura de dados que a linha em esboço B representa.
-
Arraste uma linha de esboço B em outra linha na Esboço B, que irá copiar os dados representados pela primeira linha para os dados representados na segunda linha.
Eu li documentação drag-and-drop da Apple e obteve apenas sobre a parte alguma. Realmente não parece aplicar-se para o que eu preciso fazer. O que eu estou ausente?
Solução
Você precisa de uma fonte de dados, AFAIK, você não pode fazer isso acontecer com ligações sozinho.
O inacabada Adium Xtras Criador, que está sob a licença BSD, inclui um controlador de matriz que você pode definir como fonte de dados para obter drag-and-drop em um Bindings-powered exibição de tabela .
Esta exigência não pode aplicar-se NSOutlineView e NSTreeController. Eu não tentei isso.
Outras dicas
A página que você ligado a é bastante claro sobre o que você precisa fazer. Na tabela de fonte de dados do A, implementar registerForDraggedTypes:
e tableView:writeRowsWithIndexes:toPasteboard:
para colocar alguns dados TableAPasteboardType
privadas na área de trabalho.
Em fonte de dados esboço de B, implementar os mesmos dois métodos e colocar alguns dados OutlineBPasteboardType
privadas na área de trabalho.
Finalmente, implementar tableView:validateDrop:proposedRow:proposedDropOperation:
e tableView:acceptDrop:row:dropOperation:
para verificar a área de transferência para qualquer TableAPasteboardType
ou OutlineBPasteboardType
e fazer as alterações apropriadas para o seu modelo de limite, dependendo do caso.
É bastante simples, uma vez que apenas arar e fazê-lo.
Em MacOS 10.7 alguns novos protocolos foram adicionados para implementar isso.
Há uma falta de documentação para tabelas no momento, mas você pode encontrar alguns exemplos agradáveis:
Para NSTableViwew o NSTableViewDataSource Protocolo define os seguintes métodos:
-
(BOOL)tableView:writeRowsWithIndexes:toPasteboard:
-
tableView:validateDrop:proposedRow:proposedDropOperation:
-
tableView:acceptDrop:row:dropOperation:
Para NSOutlineView o NSOutlineViewDataSource Protocolo define os seguintes métodos:
-
(BOOL)outlineView:writeItems:toPasteboard:
-
(NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
-
(BOOL)outlineView:acceptDrop:item:childIndex:
Estes são os requisitos mínimos para a implementação para cada tipo de vista. Os casos de uso são bastante semelhantes.
- Se os toPasteboard:. Método retorna SIM, o arrasto é iniciado
- A validateDrop: controlos método que nó de destino é permitido através da actualização do marcador na vista ??li>
- Voltar SIM para o acceptDrop: método se a queda foi bem sucedida
Isso levou a duas sub-casos de uso você tem que gerenciar. O primeiro é um arrastar e soltar dentro do mesmo ponto de vista ou a mesma operação entre dois pontos de vista. Além disso, você pode distinguir entre mover, copiar ou operações de exclusão. Um exemplo interessante é a forma como os pontos de interrupção trabalhar com drag & drop no Xcode.
O tableView tem alguns métodos adicionais para personalizar drag & drop, mas os que eu mencionei são os principais métodos para fazê-lo funcionar.