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?

Foi útil?

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.

  1. Se os toPasteboard:. Método retorna SIM, o arrasto é iniciado
  2. A validateDrop: controlos método que nó de destino é permitido através da actualização do marcador na vista
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top