2009-07-17 15 views
5

Sto imparando come creare programmi con Cocoa. Sto usando un'applicazione Apple di esempio che registra video da una webcam. Mi piacerebbe avviare e fermare il video catturando la pressione dei tasti. Ho provato a ignorare l'evento keydown ma ho letto che non è possibile in un NSObject. Come posso gestire questo tipo di evento?KeyDown e Cocoa Sample

La classe di applicazione estende una classe NSObject.

Questo è il codice:

- (void)keyDown:(NSEvent *)event { 
    NSLog(@"Hi there"); 
    NSString *characters = [event characters]; 
    if ([characters length]) { 
    switch ([characters characterAtIndex:0]) { 
     case NSUpArrowFunctionKey: 
     NSLog(@"Key UP"); 
     break; 
    } 
    } 
} 

risposta

7

Ho cercato di ignorare evento KeyDown, ma ho letto che Non è possibile in un NSObject.

Corretto. Solo un rispondente può rispondere agli eventi.

Come posso gestire questo tipo di evento?

Implementare un risponditore. La sottoclasse NSWindow o NSWindowController funzionerà. Assicurati di trasformare il tuo attuale controllore di finestre o finestre in un'istanza della sottoclasse.

La documentazione Cocoa spiega ulteriormente.

La classe di applicazione estende una classe NSObject.

Perché? Normalmente, la classe principale del pacchetto di applicazioni è NSApplication o una sottoclasse di questo e non ci sono molti buoni motivi per sottoclasse NSApplication.

PS: Qual è un buon libro per iniziare a imparare la programmazione MacOS?

Non ho imparato dal libro Hillegass, me stesso (sono rimasto fedele ai documenti di Apple), ma è una raccomandazione molto popolare e l'ho letto e posso dirvi che va bene.

+1

Fare attenzione che il controller della finestra, se presente, sia l'ultimo risponditore per i messaggi di eventi. I delegati ricevono solo messaggi di azione, non messaggi di eventi. – IlDan

+0

Buona cattura. Modificherò la mia risposta per non affermare che il delegato della finestra funzionerà. –

4

Dal Cocoa Event-Handling Guide - The Responder Chain:

La catena risponditore è una serie concatenata di oggetti responder a cui è applicato un messaggio di evento o azione. Quando un determinato oggetto responder non gestisce un particolare messaggio, l'oggetto passa il messaggio al suo successore nella catena (ovvero, il suo prossimo risponditore).

Quando si preme un tasto, la finestra riceve l'evento keyDown. Quindi invia l'evento al primo risponditore , che di solito è il controllo con una cornice blu attorno al bordo (prova a fare clic sul campo dell'indirizzo in Safari o Firefox, quando è blu-bezeled, quindi ha lo stato di primo risponditore) .

Se il primo risponditore non mangia la pressione del tasto (il campo indirizzo Safari fa mangiare quando visualizza un carattere), allora passa lungo la catena risponditore al successiva risponditore nella gerarchia vista, quindi alla finestra e al controller della finestra come potete vedere nello Guide.(Fai attenzione che l'azione che risponde è un'altra storia.)

Quindi devi implementare il keyDown: su una vista della tua finestra o nella finestra stessa, se non ha viste che mangiano gli eventi. Il modo più semplice per testare è sovrascrivere keyDown: metodo di una finestra vuota

Per mettere le tue mani nel funzionamento interno puoi anche provare a sovrascrivere sendEvent: metodo di una finestra. sendEvent: invia gli eventi alle viste della finestra, e da lì è possibile ad esempio registrare tutti gli eventi gestiti dalla finestra.

4

Sottoclasse NSWindow o NSWindowController funzionerà.

Analogamente, è possibile eseguire la sottoclasse di NSView e sovrascrivere i metodi di gestione degli eventi.

Che cos'è un ottimo libro per iniziare a imparare Programmazione MacOS?

Learn Objective-C on the Mac da Dalrymple è davvero semplice, copre abbastanza basi e si muove abbastanza velocemente per farti fuori terra in un breve po '. Tocca tutto da Xcode e Interface Builder alle pratiche OOP e Objective-C. Particolarmente utili per i principianti (IMHO) sono l'organizzazione del file sorgente e i capitoli del kit Foundation.

Buona fortuna!

+0

"Assicurati di trasformare il tuo attuale controllore di finestre o finestre in un'istanza della sottoclasse." Un altro grazie a Peter. Questo ha aiutato su un'altra discussione: http://stackoverflow.com/questions/1854112/keyup-event-heard-overridden-nsview-method –