2009-10-23 17 views
8

Z powodu semantyki niektórych załączników NSTextView w mojej aplikacji, chcę wiedzieć, kiedy są one wstawiane lub usuwane z mojego magazynu tekstowego.Skąd wiadomo, kiedy atrybut dodawania jest dodawany do mojego NSTextView?

Moja podklasa NSTextView implementuje metodę shouldChangeTextInRange: replacingString:, która pozwala mi łatwo zobaczyć, kiedy załącznik ma zostać zastąpiony (mogę przeszukać magazyn tekstowy w określonym zakresie).

Ponieważ zastępczy ciąg znaków jest po prostu NSString, a nie NSAttributedString, nie mogę zobaczyć z tej metody, czy załącznik jest wstawiany. Dokumentacja posuwa się nawet do stwierdzenia, że ​​ciąg może być zerowy, jeśli edytowane są tylko "atrybuty".

Pytanie brzmi: jaki jest najlepszy punkt zastępczy, aby zobaczyć, kiedy załączany jest załącznik? A może jako użyteczny: jaki jest najlepszy punkt zastąpienia, aby zobaczyć, kiedy atrybuty są modyfikowane?

Aktualizacja: Powiedziałem powyżej, nie miałem możliwości dowiedzieć się, czy załącznik jest wstawiany. Wskazano mi, że mogę powiedzieć, że załączenie "an" jest zaangażowane, ponieważ ciąg zawiera magiczną właściwość NSAttachmentCharacter. Ale nie będę mieć konkretnych informacji o załączniku, dopóki edycja nie zostanie zakończona.

Odpowiedz

4

Chciałbym rzucić okiem na metodę delegata NSTextStorage -textStorageDidProcessEditing :, która powinna być wywoływana za każdym razem, gdy dokonywana jest zmiana w bazowym magazynie tekstowym. Następnie możesz użyć metod -editedRange, -editedMask i -changeInLength, aby określić, która sekcja magazynu tekstów została zmieniona, i przejrzyj ten zakres dla wszelkich załączników, które mogą Cię zainteresować.

+0

Dzięki, Brian. To nie jest tak idealne, jak się spodziewałem, ale wygląda na to, że to wystarczy. Szkoda, że ​​nie zawierają atrybutów w metodzie shouldChange .... – danielpunkass

+0

O ile mi wiadomo, '-textStorageWillProcessEditing:' pozwala na więcej zmian w tekście niż '-textStorageDidProcessEditing:'. Zamiast tego możesz użyć tego. –

2

Czasami warto spojrzeć na dwóch NSTextStorage metod Delegat:

- (void)textStorageWillProcessEditing:(NSNotification *)notification; 
/* Delegate can change the characters or attributes */ 

- (void)textStorageDidProcessEditing:(NSNotification *)notification; 
/* Delegate can change the attributes */ 

Wewnątrz textStorageWill/DidProcessEditing można nazwać -[NSTextStorage editedMask] i -[NSTextStorage editedRange] aby dowiedzieć się, co się zmieniło, a następnie podjąć odpowiednie działania.

+0

Cześć Jonathan - dzięki za komentowanie. Głosowałem za twoją odpowiedzią, ale zdecydowałem się zaakceptować Briana, ponieważ było to kilka chwil wcześniej i dlatego, że zgromadził kilka dodatkowych głosów. – danielpunkass

Powiązane problemy