2014-11-18 2 views
2

Итак, в моем приложении быстрой настройки OS X у меня есть один пользовательский вид и одна кнопка. Когда я запускаю свое приложение, мое представление показывает красный овал, и мне нужно изменить этот рисунок на drawRectangle() -метод, когда я нажимаю кнопку. КлассИзменение чертежей пользовательских видов при нажатии кнопки в приложении Swift OS X

моего пользовательского вида в MyView выглядит следующим образом:

import Cocoa 
import AppKit 

class MyView: NSView { 

    var isTrue = true 

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

     // Drawing code here. 
     if isTrue { 
      DrawingMethods.drawOval() 
     } else { 
      DrawingMethods.drawRectangle() 
     } 

    } 

    @IBAction func buttonPressed(sender: AnyObject) { 

     isTrue = false 
     // Now I need to update the view, so it draws rectangle isntead of oval. How I do that? 

    } 
} 

И у меня DrawingMethods класса:

import Cocoa 

public class DrawingMethods: NSObject { 

    public class func drawOval() { 

     let color = NSColor(calibratedRed: 1, green: 0, blue: 0, alpha: 1) 
     let ovalPath = NSBezierPath(ovalInRect: NSMakeRect(64, 54, 50, 45)) 
     color.setFill() 
     ovalPath.fill() 
    } 

    public class func drawRectangle() { 

     let color = NSColor(calibratedRed: 1, green: 0, blue: 0, alpha: 1) 
     let rectanglePath = NSBezierPath(rect: NSMakeRect(136, 12, 34, 34)) 
     color.setFill() 
     rectanglePath.fill() 
    } 
} 

Итак, как я могу получить мои пользовательские представления нарисовать прямоугольник вместо овала?

ответ

1

Позвонить setNeedsDisplayInRect() на вид после установки isTrue = false. Это уведомит мнение о необходимости его перерисовки и снова вызовет drawRect.

Ваша buttonPressed функция должна быть определена в ViewController, который содержит пользовательское представление

import Cocoa 

class ViewController: NSViewController { 
    @IBOutlet customView: MyView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    @IBAction func buttonPressed(sender: AnyObject) { 
     customView.isTrue = false 
     customView.setNeedsDisplayInRect(customView.bounds) 
    } 
} 

В качестве альтернативы, вы можете просто установить needsDisplay свойство зрения, чтобы true перерисовывать весь вид:

customView.needsDisplay = true 
+0

Извините, я очень плохо программирую и плохо владею английским, я не знаю, что означает флаг в этом контексте. Я знаю только «захватить флаг« »:) Так что я должен назвать эту функцию в моей функции« buttonPressed »? Можете ли вы показать в коде, как вы это делаете? – Prontto

+0

Так вот так? setNeedsDisplayInRect (<# invalidRect: NSRect #>) Что я должен положить в круглые скобки? – Prontto

+0

Я обновил ответ. – vacawama