• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: How to make a NSText​Find​Bar​Container client.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to make a NSText​Find​Bar​Container client.


  • Subject: Re: How to make a NSText​Find​Bar​Container client.
  • From: corbin dunn <email@hidden>
  • Date: Wed, 29 Mar 2017 11:29:30 -0700

> On Mar 28, 2017, at 1:45 PM, Daryle Walker <email@hidden> wrote:
>
> It seems that I’ll be the first American in general & GitHub open-source history to ever make a NSText​Find​Bar​Container subclass. The window controller shows two views in a split view. The top half is a NSTableView surrounded by a NSScrollView. The bottom half is a NSTextView surrounded by a scroll view. Each one can handle NSTextFinder, but I’m considering them halves of the same document (since they are). So I’m make a single find-bar to cover both views. I’ve read about NSTitlebarAccessoryViewController and wonder if I can use it to hold the Find controls.
>
>> class MyWindowController: NSWindowController {
>>    //...
>>    dynamic var representedMessage: RawMessage?
>>    dynamic var isWritable: Bool = true
>>
>>    // Outlets
>>    @IBOutlet weak var messageController: NSObjectController!
>>    @IBOutlet weak var headerController: NSArrayController!
>>    @IBOutlet weak var textFinder: NSTextFinder!
>>    @IBOutlet weak var accessoryView: NSVisualEffectView!
>>
>>    // Pseudo-outlets
>>    var headerViewController: NSViewController!
>>    var bodyViewController: NSTabViewController!
>>    var addBodyViewController: NSViewController!
>>    var bodyTextViewController: NSViewController!
>>
>>    var headerTableView: NSTableView!
>>    var bodyTextView: NSTextView!
>>
>>    /// Table of which characters, combining the header and body as a single string, are where.
>>    dynamic var textRanges = [NSMakeRange(0, 0)]
>>    /// The accessory title-bar to contain the text-finding controls.
>>    let findBar = NSTitlebarAccessoryViewController()
>>

This creates an empty class; you should subclass NSTitlebarAccessoryViewController and provide implementation stuff to get the view, or use initWithNibName and pass in your NIB that contains the view. Hence the log you mention later.

>>    //…

You left off what you are doing here; it might be relevant.

corbin

>>
>>    override func windowDidLoad() {
>>        super.windowDidLoad()
>>        //...
>>        findBar.layoutAttribute = .bottom
>>    }
>>    //...
>> }
>
> I added a NSTextFinder to my window controller’s top bar and added an outlet. I’m using the window controller class as the NSTextFinderClient delegate:
>
>> extension MyWindowController: NSTextFinderClient {
>>
>>    /// Determine the right substring, from the text range map.
>>    func string(at characterIndex: Int, effectiveRange outRange: NSRangePointer, endsWithSearchBoundary outFlag: UnsafeMutablePointer<ObjCBool>) -> String {
>>        //...
>>    }
>>
>>    /// Determine the length of the virtual string, from the text range map.
>>    func stringLength() -> Int {
>>        return NSMaxRange(self.textRanges.last!)
>>    }
>>
>> }
>
> and a NSTextFindBarContainer delegate:
>
>> extension MyWindowController: NSTextFinderBarContainer {
>>
>>    var findBarView: NSView? {
>>        get { return self.findBar.view }
>>        set { self.findBar.view = newValue ?? /*self.accessoryView*/ NSView() }
>>    }
>>
>>    func contentView() -> NSView? {
>>        return self.window?.contentView
>>    }
>>
>>    var isFindBarVisible: Bool {
>>        get {
>>            return self.findBar.parent != nil
>>        }
>>
>>        @objc(setFindBarVisible:) set {
>>            if newValue && self.findBar.parent == nil {
>>                self.window?.addTitlebarAccessoryViewController(self.findBar)
>>            } else if !newValue && self.findBar.parent != nil {
>>                self.findBar.removeFromParentViewController()
>>            }
>>        }
>>    }
>>
>>    func findBarViewDidChangeHeight() {
>>        // Do I need to do something here?
>>    }
>>
>> }
>
> I have no idea if what I’m doing here is even close to being right. (The “accessoryView” property maps to a NSVisualEffectView that I made because I thought “NSView()” was wrong at first. It made no difference.) When I try running the app, creation of the first window is jammed by:
>
>> 2017-03-28 15:33:27.659649 XNW[51906:6766586] -[NSNib _initWithNibNamed:bundle:options:] could not load the nibName: NSTitlebarAccessoryViewController in bundle (null).
>> 2017-03-28 15:33:27.677235 XNW[51906:6766586] -[NSNib _initWithNibNamed:bundle:options:] could not load the nibName: NSTitlebarAccessoryViewController in bundle (null).
>
> Is anyone from Apple and/or has privately made a NSTextFindBarContainer class capable of helping? As I said, there are no answers from WebSearch (i.e. others will be helped by me). Is there Apple sample code that covers this?
>
> —
> Daryle Walker
> Mac, Internet, and Video Game Junkie
> darylew AT mac DOT com
>
> _______________________________________________
>
> 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


_______________________________________________

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


References: 
 >How to make a NSText​Find​Bar​Container client. (From: Daryle Walker <email@hidden>)

  • Prev by Date: Re: Can't use +initialize, now what?
  • Next by Date: Re: Can't use +initialize, now what?
  • Previous by thread: How to make a NSText​Find​Bar​Container client.
  • Next by thread: Can't use +initialize, now what?
  • Index(es):
    • Date
    • Thread