2016-09-29 6 views
1

Я написал этот код в Swift 3.0, но метод draw не вызывается из func drawBorder by needsDisplay = true; drawBorder вызывается нажатием кнопки в другом представлении. Спасибо за любой намек.func draw (_ dirtyRect: NSRect) не называется

class clsDrawView: NSView { 

private var redraw = false 
var border = NSBezierPath() 
var color = NSColor() 

override func draw(_ dirtyRect: NSRect) { 
    super.draw(dirtyRect) 

    // Drawing code here. 
    if redraw { 
     color.setStroke() 
     border.stroke() 
    } 
} 

func drawBorder() { 
    redraw = true 
    color = NSColor.blue 
    border.lineWidth = CGFloat(10) 
    border.move(to: NSPoint(x: 20, y: 20)) 
    border.line(to: NSPoint(x: 50, y: 50)) 
    needsDisplay = true 
} 

}

ответ

1

Наконец я решил его с помощью уведомления

class clsDrawView: NSView { 

private var draw = false 
private var border = NSBezierPath() 
var color = NSColor() 

override func draw(_ dirtyRect: NSRect) { 
    super.draw(dirtyRect) 

    NotificationCenter.default.addObserver(self, selector: #selector(self.drawBorder(_:)), name: NSNotification.Name(rawValue: "drawBorder"), object: nil) 

    // Drawing code here. 
    if draw { 
     color.setStroke() 
     border.stroke() 
    } 
} 

func drawBorder(_ notification: NSNotification) { 
    draw = true 
    color = NSColor.black 
    NSBezierPath.setDefaultLineWidth(4) 
    border.lineWidth = CGFloat(10) 
    border = NSBezierPath(rect: self.bounds) 
    needsDisplay = true 
} 
} 

Уведомление Postec от ViewController как этот

@IBAction func btnDraw(_ sender: NSButton) { 
    NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: "drawBorder"), object: sender) 
} 
1

Попытка вызвать метод setNeedsDisplay(_:) на ваш взгляд, это должен вызвать draw(_:) метод. Никогда не вызывайте метод draw(_:).

+0

Вместо needsDisplay собственности попытка вызова setNeedsDisplay() в методе drawBorder. –

+0

Я не назову ничью (_ :) Я просто установил needsDisplay = true, который должен обеспечить вызов draw (_ :). У меня есть подозрение, что это потому, что я вызываю drawBorder нажатием кнопки за пределами пользовательского представления. Если я назову это из ** переопределить func mouseUp (с событием: NSEvent) { drawBorder() } **, то он отлично работает. – Dawy

+0

Я добавил setNeedsDisplay (self.bounds) и без изменений. Обратите внимание, что setNeedsDisplay (InvalidRect: NSRect) нужен аргумент в Swift 3 – Dawy