Domanda

E 'possibile passare il puntatore ad un oggetto in un'operazione di drag and drop?

Ecco lo scenario ...

Ho un 'NSArray' di oggetti personalizzati. Per amor di argomenti diremo che si tratta di un elenco di oggetti persona.

La lista è legata ad un NSTableView tramite un NSArrayController. Il NSTableView è una fonte di trascinamento e ho un NSView come destinazione di trascinamento.

Nell'attuare trascinamento posso facilmente ottenere il nome della persona selezionata (s) dalla NSArrayController come NSString nel processo di trascinamento e passarlo al ricevitore nel NSView.

Tuttavia, vorrebbe poter passare un puntatore all'oggetto persona in modo che il ricevitore ha accesso all'intero oggetto.

Il problema sembra essere che l'operazione di trascinamento crea una nuova istanza di un oggetto persona e non fa riferimento all'oggetto persona selezionata nonostante implementare i metodi richiesti nel modello persona. Come risultato ho un oggetto persona a destinazione, semplicemente non è popolata con i dati dall'oggetto.

I idealmente voglio il puntatore oggetto perché l'NSView farà uso del riferimento a un oggetto, in modo che eventuali aggiornamenti l'oggetto stesso si riflettono sia nel NSView e NSTableView (e ovunque l'oggetto viene utilizzato).

E 'anche possibile utilizzare il riferimento all'oggetto in un'operazione di drag and drop o devo passare qualche riferimento personalizzato che è un iVar dell'oggetto persona e poi fare una ricerca, una volta arrivati ??a destinazione? (Questo sembrerebbe un po 'arcaica per me considerando quanto oggetto riferimento Obj-C ha).

Capisco che un obiettivo potrebbe accettare un'operazione di trascinamento dall'esterno dell'applicazione, ma specificando l'operazione come un'operazione locale spiegherebbe questo non è vero?

Ho controllato i documenti di Apple, ma ancora non sembrano essere in grado di trovare una risposta.

Trascina e Programmazione goccia Argomenti

cartone Guida di programmazione

Qualsiasi aiuto molto apprezzato.

È stato utile?

Soluzione

Un cartone è solo un contenitore per i dati in diversi tipi, in modo da ciò che si mette sul tavolo di montaggio deve essere convertibile in dati in un certo tipo.

Quello che vi serve è quello di dare ad ogni oggetto Person un identificatore di qualche tipo e che mettere sul tavolo di montaggio sotto un tipo personalizzato identificativo della propria invenzione. In generale, tale identificativo deve essere l'identificatore pacchetto dell'applicazione (che dovrebbe essere il contrario del nome di dominio più il vostro nome-esempio di applicazione, com.example.surfwriter) più il nome del tipo (ad esempio, com.example.surfwriter .tabstop).

Quando si riceve una goccia, verificare la presenza di questo tipo. Se è presente, cercare l'oggetto giusto e fare tutto ciò che si dovrebbe con esso. A trascinare dalla visualizzazione tabella alla stessa vista tabella deve implementare questo spostando o copiando l'oggetto in una nuova riga.

non usare l'indirizzo dell'oggetto-cioè., L'oggetto stesso, come suo identificatore. Se le matrici oggetto (ad esempio, viene eliminato), l'indirizzo non sarà più valida, o può riferirsi ad un oggetto diverso (che possono o non possono essere della stessa classe dell'oggetto originale). Usa qualcosa che si può guardare in alto e sicuro non trovare. Questo vale per tagliare / copiare e incollare più che trascina, ma si può e deve gestire sia con praticamente lo stesso codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top