2009-10-23 66 views
8

由於我的應用程序中某些NSTextView附件的語義,我想知道它們何時插入或從我的文本存儲中刪除。如何知道附件屬性何時添加到我的NSTextView?

我的NSTextView的子類實現了shouldChangeTextInRange:replacementString:方法,它允許我很容易地看到何時將要替換附件(我可以在指定範圍內搜索文本存儲)。

由於替換字符串只是一個NSString而不是一個NSAttributedString,我無法從這個方法看到是否正在插入附件。文檔甚至可以說,如果正在編輯「僅屬性」,字符串可能爲零。

所以問題是,附件插入時看到的最佳覆蓋點是什麼?或者也許是有用的:當屬性被修改時,什麼是最好的覆蓋點?

更新:我上面說過,我無法知道是否正在插入附件。它指出,我可以告訴「一個」附件涉及,因爲該字符串將包含神奇的NSAttachmentCharacter。但是在編輯完成之前,我將不會獲得有關附件的特定信息。

回答

4

我會看看NSTextStorage委託方法-textStorageDidProcessEditing:每次對底層文本存儲進行更改時應該調用它。然後,您可以使用-editedRange,-editedMask和-changeInLength方法來確定文本存儲的哪個部分已更改,並在該範圍內查找您可能感興趣的任何附件。

+0

謝謝Brian。這並不像我所希望的那麼理想,但它看起來似乎會有所斬獲。遺憾的是,它們不包含shouldChange ...方法中的屬性。 – danielpunkass

+0

據我所知,'-textStorageWillProcessEditing:'允許對文本進行更多的更改,而不是'-textStorageDidProcessEditing:'。您可能想使用它。 –

2

您可能要採取一看,二NSTextStorage委託方法:

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

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

裏面textStorageWill/DidProcessEditing,你可以打電話-[NSTextStorage editedMask]-[NSTextStorage editedRange]找出哪些改變,然後採取相應的行動。

+0

嗨喬納森 - 感謝評論。我投了你的答案,但決定接受布賴恩的,因爲它是早些時候,因爲它累積了一些額外的選票。 – danielpunkass

相關問題