2008-08-14 12 views
15

Ich lerne langsam Objective-C und Cocoa, und die einzige Möglichkeit, die wichtigsten Ereignisse in Textansichten zu erfassen, ist Delegierung zu verwenden, aber ich habe Probleme, nützliche Dokumentation und Beispiele zur Implementierung eines solchen zu finden Lösung. Kann mir jemand in die richtige Richtung zeigen oder Hilfe aus erster Hand geben?Die beste Methode, wichtige Ereignisse in NSTextView zu erfassen?

Antwort

14

Im Allgemeinen besteht die Art, wie Sie es implementieren, einfach darin, dem Controller Ihrer Ansicht die erforderliche Funktion hinzuzufügen und seinen Delegaten festzulegen. Wenn Sie beispielsweise beim Laden der Ansicht Code ausführen möchten, delegieren Sie Ihre Ansicht einfach an den Controller und implementieren die Funktion "watchFromNib".

So ein Tastendruck in einer Textansicht, stellen Sie sicher, dass Ihr Controller ist der Text nach Ansicht der Delegierten, zu erkennen und dann implementieren diese:

- (void)keyUp:(NSEvent *)theEvent 

Beachten Sie, dass dies ist eine vererbte NSResponder Methode, kein NSTextView Methode.

+1

keyUp wird nicht aufgerufen, wenn Sie es in den Delegaten einfügen. Sie müssen die NSTextView ableiten und dort ablegen. –

2

Es ist wichtig, dass Sie uns mitteilen, was Sie wirklich erreichen möchten - das übergeordnete Ziel, das Sie bei der Erfassung wichtiger Ereignisse in einem NSTextView beachten.

Zum Beispiel, wenn jemand mich fragt, wie wichtige Ereignisse in einem NSText Feld erfassen, was sie wirklich wissen möchten ist, wie Eingaben im Feld zu validieren. Dies geschieht, indem der Formatierer des Feldes auf eine Instanz von NSFormatter gesetzt wird (unabhängig davon, ob einer der Formatierungen in Cocoa enthalten ist oder ein benutzerdefinierter), und nicht durch direkte Verarbeitung von Tastatureingaben.

Also dieses Beispiel, was versuchst du wirklich zu erreichen?

1

Ich habe etwas hart gegraben, und ich habe eine Antwort auf meine eigene Frage gefunden. Ich werde unten weitermachen, aber danke an die zwei Jungs, die geantwortet haben. Ich denke, dass Stack Overflow bereits eine fantastische Seite ist - ich hoffe, dass mehr Mac-Entwickler ihren Weg finden, sobald die Beta vorbei ist - dies könnte eine großartige Ressource für andere Entwickler sein, die auf die Plattform wechseln wollen.

Also, ich habe, wie von Danny vorgeschlagen, meine Antwort in Delegation finden. Was ich von Dannys Beitrag nicht verstand, war, dass es im delegierenden Objekt eine Reihe von delegierten Methoden gibt und dass der Delegierte diese Ereignisse implementieren muss. Und so konnte ich für eine TextView die Methode textDidChange finden, mit der ich das, was ich wollte, noch besser erreichen konnte, als einfach nur das Drücken von Tasten drücken würde. Also wenn ich dies in meinem Controller implementiere:

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

Ich kann auf den Text reagieren, der bearbeitet wird. Es gibt natürlich noch andere Methoden, und ich freue mich darauf, mit ihnen zu spielen, weil ich weiß, dass ich eine Menge lernen werde. Danke nochmal, Leute.

10

Nur ein Tipp für Syntax-Hervorhebung:

Sie den ganzen Text Ansicht nicht auf einmal markieren - es ist sehr langsam. Markieren Sie auch nicht den zuletzt bearbeiteten Text mit -editedRange - es ist auch sehr langsam, wenn der Benutzer einen großen Textkörper in die Textansicht einfügt.

Stattdessen müssen Sie den sichtbaren Text markieren, die wie dies geschehen ist:

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

Dann Sie visibleRange auf Ihre Markierung Code füttern.

Verwandte Themen