La gestione dei messaggi per il primo risponditore in un controller della vista
-
19-09-2019 - |
Domanda
Devo essere manca qualcosa di semplice, ma non riesco a vederlo. In primo luogo, il programma di installazione:
-
DATreeView
, una sottoclasse diNSView
-
DATreeViewController
, una sottoclasse diNSViewController
-
MainMenu.xib
ha un'istanza diDATreeViewController
, che è configurato per caricare una vista daDATreeView.xib
-
MainMenu.xib
ha anche un'istanza diDendreaAppDelegate
, che ha una presaDATreeViewController
(che è collegato fino a esempio diMainMenu.xib
DATreeViewController
. -
Do Something!
, una voce di menu cablato per inviare un messaggiodoSomething:
alla First Responder. - Non a caso,
DATreeViewController
ha un'azione chiamatodoSomething:
.
Quello che voglio è per la voce di menu Do Something!
per innescare l'azione doSomething:
su DATreeViewController
, e facciamo finta che non posso semplicemente impostare direttamente la connessione di destinazione / azione. Mi fermo qui e chiedo, è il mio disegno del tutto sbagliato? È quello che sto cercando di fare stupidi / male / probabile che la vergogna mi negli occhi del mio Dio?
No? Grande. Ora, per la vita di me, non riesco a ottenere la voce di menu di essere attivi. Sto facendo questo su Snow Leopard, se questo fa alcuna differenza.
Al fine di ottenere una buona integrazione tra NSView
e NSViewController
, ad esempio gestione della catena di risponditore, ho seguito di Matt Gallagher ad esempio , con un cambiamento sostanziale: in nessun punto del processo di caricamento NIB non NSView
sembra di ricevere un messaggio setViewController:
, così io mando il messaggio me stesso in un messaggio di DATreeViewController
loadView
. Da quello che posso dire, dopo aver eseguito il seguente codice nel applicationDidFinishLaunching:
NSView *view = self.treeViewController.view;
[self.window.contentView addSubview:view];
la catena risponditore è impostato come previsto, vale a dire:
NSWindow < NSView < DATreeViewController < DATreeView
E 'stata la mia aspettativa che, essendo come DATreeViewController
è parte della catena responder, e di essere in quanto risponde alle doSomething:
, e di essere in quanto implementa alcuna convalida, tutto quello che ho dovuto fare è usare Interface Builder per cablare il menù Do Something!
elemento per il proxy First Responder, con doSomething:
come la sua azione, e la voce di menu sarebbe attiva automaticamente.
Che cosa sto facendo di sbagliato? Grazie a tutti per il vostro prezioso aiuto!
Soluzione
La vostra vista accetta e diventare con successo il primo risponditore?
Altri suggerimenti
È DATreeViewController cablato alla presa viewController del DATreeView in IB?
Hai tracciata attraverso setViewController: e setNextResponder:? Per verificare che nextResponder è stato impostato correttamente
La catena risponditore funziona solo per i messaggi nella superclasse NSResponder
quali mouseDown
mouseExited
ecc ho credo che si possa fare qualcosa di subdolo con l'aggiunta di una categoria per NSResponder
a ribollire altri metodi, cercando al nextResponder
e l'invio del messaggio su se nextResponder
esiste.
Questo sembra essere un esempio di questa tecnica: https: // github.com/MrNoodle/NoodleKit/blob/master/NSResponder-NoodleModalExtensions.m