Re: Correct usage of NSTextView and NSFindBar
Re: Correct usage of NSTextView and NSFindBar
- Subject: Re: Correct usage of NSTextView and NSFindBar
- From: Kevin Perry <email@hidden>
- Date: Mon, 23 Sep 2013 09:43:13 -0700
On Sep 20, 2013, at 10:15 PM, Martin Hewitson <email@hidden> wrote:
> Actually, I got this wrong. I swap out the textstorage in the textview by calling setTextView on the textContainer which I get from the textStorage that belongs to the file instance being edited. This is probably why I'm bypassing the 'notification' chain. Perhaps I'm going about this 'one editor for many files' problem the wrong way because looking back at (very) old code I get the textContainer by doing
>
> - (NSTextContainer*)textContainer
> {
> // An ugly quick hack to return the 'main' text container for this document
> return [[self.textStorage layoutManagers][0] textContainers][0];
> }
>
> Is there a better way to do all this?
That seems a little backwards to me.
NSLayoutManager is really the center of the Cocoa text architecture. It manages the list of NSTextViews, the list of NSTextContainers (those two objects are associated 1-to-1), and the NSTextStorage that will be rendered and laid out between all of the NSTextViews. It sounds like you're assuming there's a 1-to-1 association between NSTextStorage and NSTextContainer objects, which I don't think is true. The NSTextContainer's job is to define the region in which the text should be rendered—it doesn't really have anything to do with the string itself. Thus, instead of doing this to swap out your NSTextStorage:
[textView setTextContainer: <the code you have above>];
… it would make more sense to me to do:
[textView.layoutManager replaceTextStorage: newTextStorage];
Take a look at https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextSystemArchitecture/ArchitectureOverview.html#//apple_ref/doc/uid/TP40009459-CH7-SW1 for more in-depth information.
-KP
> Many thanks,
>
> Martin
>
>
> On Sep 21, 2013, at 06:52 AM, Martin Hewitson <email@hidden> wrote:
>
>> Ah, that's very useful information. I actually maintain multiple NSTextStorage instances, one for each file that's being managed, and swap those in and out by doing setTextView on the storage instance. So is this somehow bypassing the chain of notifications that tells NSTextFinder that the string changed? Any way around that?
>>
>> Many thanks,
>>
>> Martin
>>
>>
>>
>>
>> On Sep 20, 2013, at 07:37 PM, Kevin Perry <email@hidden> wrote:
>>
>>>
>>> On Sep 20, 2013, at 10:00 AM, Martin Hewitson <email@hidden> wrote:
>>>
>>>> Dear list,
>>>>
>>>> I have an editor app which presents a list of files that can be edited. Selecting a file displays the text contents in an NSTextView subclass. On 10.7 and later the app supports using the FindBar. Searching the currently displayed text works fine the first time the find bar is used. But if another file is selected (so that the text in the textview changes) then the find bar shows nonsensical results, as if subsequent uses are still looking at the contents of the file that where displayed when the find bar was first invoked.
>>>>
>>>> Is there something I can/should do to 'reset' the find bar when the file being edited changes? I couldn't find anything in the documentation, and I couldn't figure out how to get the NSTextFinder instance that the textview is using, and even if I could, I don't see anything in the documentation to 'reset' its state, or set the string it should search.
>>>
>>> How are you replacing the NSTextView contents when switching files? The 'reset' call for NSTextFinder when the client's content changes is -noteClientStringWillChange. NSTextView is supposed to invoke this during -shouldChangeTextInRanges:replacementStrings:. It's also invoked during -[NSLayoutManager setTextStorage:], so when you switch your NSTextView contents, you could load the new file's contents into a new NSTextStorage instance, then invoke [[textStorage layoutManager] replaceTextStorage:newTextStorage].
>>>
>>> -KP
>>>
>>>> Am I going about this all the wrong way? I thought this is one of those 'it just works' cases....
>>>>
>>>> Many thanks,
>>>>
>>>> Martin
>>>>
>>>>
>>
>>
>>
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Martin Hewitson
> Albert-Einstein-Institut
> Max-Planck-Institut fuer
> Gravitationsphysik und Universitaet Hannover
> Callinstr. 38, 30167 Hannover, Germany
> Tel: +49-511-762-17121, Fax: +49-511-762-5861
> E-Mail: email@hidden
> WWW: http://www.aei.mpg.de/~hewitson
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>
>
>
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden