В итоге. Придумал костыль. Для NSView есть NSNotification.Name.NSViewBoundsDidChange. Соотсветсвенно прописал в NSView :
var locationNSRange = NSRange()
override func mouseDown(with event: NSEvent)
{
locationNSRange = NSRange()
let mouseLocationNSPoint = self.convert(event.locationInWindow, from: nil)
if arrayOfNSRanges_NSBezierPaths.isEmpty != true
{
for each in arrayOfNSRanges_NSBezierPaths
{
if each.0.contains(mouseLocationNSPoint) == true
{
locationNSRange = each.1
}
}
}
self.bounds = NSRect(x: 0.0, y: 0.0, width: 870.1, height: 540.1)
}
override func mouseUp(with event: NSEvent)
{
self.bounds = NSRect(x: 0.0, y: 0.0, width: 870.0, height: 540.0)
locationNSRange = NSRange()
}
override func acceptsFirstMouse(for event: NSEvent?) -> Bool
{
return true
}
Что означает, что при mouse down изменяем bounds для NSView и посылаем Notification. Далее при mouse up возвращаем bounds к исходным значениям и посылаем Notification. Изменение для bounds делаем маленьким, чтобы было незаметно. Соотвественно, при нажатии мышкой на отрезок в NSView, в итоге, в контроллере получаем NSRange и подсвечиваем текст ему соотвествующий.
func controlMouseDownUp(_ notification: Notification)
{
let range = myNSView.locationNSRange
myTextView.showFindIndicator(for: range)
}