How to make a NSTextFindBarContainer client.
How to make a NSTextFindBarContainer client.
- Subject: How to make a NSTextFindBarContainer client.
- From: Daryle Walker <email@hidden>
- Date: Tue, 28 Mar 2017 16:45:32 -0400
It seems that I’ll be the first American in general & GitHub open-source history to ever make a NSTextFindBarContainer 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()
>
> //...
>
> 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