2016-03-05 2 views
0

У меня есть «лист» как NSWindowController в Swift для OS X. Я разместил на листе NSView с пользовательским контроллером в классе под названием CustomView. Все, что я делаю на листе и в настраиваемом контроллере, отлично работает.вызовите func в NSWindowController из пользовательского класса для NSView

class MySheet: NSWindowController { 

//... 

} 

class CustomView: NSView { 

    override func drawRect(dirtyRect: NSRect) { 

     super.drawRect(dirtyRect) { 

     // Draw some things... 

     } 
    } 

    override func mouseDown(theEvent: NSEvent) { 
     // Change text on a label (or whatever) in MySheet() 
    } 
} 

Теперь мне нужно реагировать на ввод пользователя в CustomView, в частности, одним нажатием кнопки мыши на точке зрения, а также изменять метку (или другой элемент управления) обратно в MySheet(). Это должно быть очень просто, но я не знаю, как это сделать. Самый большой камень преткновения, который у меня есть, это то, что у меня нет экземпляра MySheet(); он скрыт в способе работы системы. Я могу вернуться к статической функции в MySheet(), но это не позволит мне изменить ярлык или другой элемент управления через @IBOutlet.

Я знаю, что вышеизложенное является скорее всего наивным вопросом, но будет признателен за любую помощь в решении.

+0

Я смущен. Есть ли экземпляр CustomView в окне, контролируемом MySheet? И есть ли представление содержимого окна, загруженного из раскадровки или xib? –

ответ

0

Конечно, (!), Эта проблема должна решаться с помощью делегата, и когда она настроена правильно, она работает нормально. Так у меня есть вот так:

protocol ClickableCurves { 
    func clickedOnCurve(index: Int) 
} 

class MySheet: NSWindowController, ClickableCurves { 

    private let lineColorCount = 16 

    func clickedOnCurve(index: Int) { 
     Swift.print("came back as \(index)") 
    } 

    override func windowDidLoad() { 
     super.windowDidLoad() 
     (curveView as! DefaultCurveAttrView).delegate = self 
    } 

    @IBOutlet weak var curveView: NSView! 
}  

class DefaultCurveAttrView: NSView { 

    var delegate: ClickableCurves? = nil 

    override func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
    } 

    override func mouseDown(theEvent: NSEvent) { 

     let frameRelWindow = self.convertRect(bounds, toView: nil) 

     let x = theEvent.locationInWindow.x - frameRelWindow.origin.x 
     let y = theEvent.locationInWindow.y - frameRelWindow.origin.y 

     let xm = bounds.width/10 
     let dy = bounds.height/CGFloat(lineColorCount + 1) 

     var yc: CGFloat = dy/2 

     if x >= xm && x <= 9 * xm { 
      for i in 1 ... lineColorCount { 

       yc += dy 

       if yc > y || i == lineColorCount { 
        if delegate != nil { 
         delegate!.clickedOnCurve(i - 1) 
        } 

        break 
       } 
      } 
     } 
    } 
} 
Смежные вопросы