Cel mai bun mod de a captura evenimentele cheie în NSTextView?

Învăț încet Obiectiv-C și Cacao și singura modalitate prin care văd până acum capturarea evenimentelor-cheie în Vizualizările de text este de a utiliza delegarea, dar am probleme cu găsirea unei documentații utile și a unor exemple privind implementarea unei astfel de soluții. Poate cineva să mă îndrepte în direcția corectă sau să furnizez niște ajutor de primă mână?

0
fr hi bn

4 răspunsuri

Am făcut niște sapaturi grele și am găsit un răspuns la întrebarea mea. Mă duc la el mai jos, dar mulțumită celor doi care au răspuns. Cred că Stack Overflow este deja un site fantastic - sper că mai mulți dezvoltatori de Mac își găsesc drumul în momentul în care beta-ul sa terminat - aceasta ar putea fi o resursă excelentă pentru alți dezvoltatori care doresc să treacă la platformă.

Deci, așa cum am sugerat Danny, am găsit răspunsul meu în delegare. Ceea ce nu am înțeles din postul lui Danny a fost că există un set de metode activate în delegarea obiectului și că delegatul trebuie să implementeze acele evenimente. Și astfel, pentru un TextView, am reușit să găsesc metoda textDidChange, care a realizat ceea ce vroiam într-un mod mai bun decât ar fi fost pur și simplu capturarea preselor cheie. Deci, dacă pun în aplicare acest lucru în controlorul meu:

- (void)textDidChange:(NSNotification *)aNotification;

Pot răspunde textului care este editat. Există, bineînțeles, alte metode disponibile și sunt încântată să joc cu ei, pentru că știu că voi învăța o mulțime ca mine. Mulțumesc din nou, băieți.

0
adăugat

Este important să ne spui ceea ce încerci cu adevărat să faci? obiectivul de nivel superior pe care credeți că îl va capta evenimentele cheie într-un NSTextView va fi abordat.

De exemplu, atunci când cineva mă întreabă cum să captez evenimentele cheie dintr-un câmp NSText , ceea ce doresc cu adevărat să știe este cum să validezi intrarea în câmp. Asta se face prin setarea formatterului câmpului la o instanță a NSFormatter (fie că este vorba de unul dintre formatorii inclusi în Cacao sau unul personalizat), nu prin prelucrarea directă a intrărilor de la tastatură.

Deci, având în vedere acest exemplu, ce încercați cu adevărat să realizați?

0
adăugat

În general, modul în care o implementați este pur și simplu să adăugați funcția necesară la controlerul vizualizării și să setați delegatul. De exemplu, dacă doriți să rulați codul atunci când se încarcă vizualizarea, purtați doar punctul de vedere al controlerului și implementați funcția awakeFromNib.

Deci, pentru a detecta o apăsare de tastă într-o vizualizare text, asigurați-vă că controlerul dvs. este delegatul vizualizării textului și apoi implementați-l:

- (void)keyUp:(NSEvent *)theEvent

Rețineți că aceasta este o metodă NSResponder moștenită, nu o metodă NSTextView.

0
adăugat
keyUp nu este invocat dacă îl puneți în delegat. Trebuie să subclasați NSTextView și să îl puneți acolo.
adăugat autor Bob Murphy, sursa

Doar un sfat pentru evidențierea sintaxei:

Nu evidențiați simultan întreaga vizualizare de text - este foarte lent foarte . De asemenea, nu evidențiați ultimul text editat utilizând -editedRange - este prea lent dacă utilizatorul introduce un text mare în text.

În schimb, trebuie să evidențiați textul vizibil care se face astfel:

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];

Apoi alimentați vizibilRange spre codul de evidențiere.

0
adăugat