需要帮助让IBDesignable正常工作

时间:2014-12-12 16:36:46

标签: objective-c cocoa swift ibdesignable

我无法使用我的自定义按钮来预览基本示例,这使我无法使用对我的开发有很大帮助(IBDesignable)。

我的自定义按钮代码如下:

import Cocoa
@IBDesignable class MyButton: NSButton {

    @IBInspectable var name:String = "Bob"{
        didSet{
            setup()
        }
    }

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        setup()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setup()
    }

    override func prepareForInterfaceBuilder() {
        setup()
    }

    func setup(){
        self.title = name
        self.setNeedsDisplay()
    }

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
        // Drawing code here.
    }

}

然后我将自定义视图或NSButton拖到我的画布(mainmenu.xib)上,并在检查器窗口中将其类类型调整为MyButton。弹出可检查字段并且没有错误但是当我在属性面板中更改其值时,我的自定义按钮不会更改其名称!

此外,当我将自定义视图拖到画布上时,我得到的是一个空白/透明矩形代替按钮(在将类更改为MyButton之后)。

非常感谢任何帮助。这让我疯了!

1 个答案:

答案 0 :(得分:0)

我必须将按钮放在NSView

@IBDesignable
public class MyButton: NSView {

    @IBInspectable var name: String = "Bob" {
        didSet{
            button?.title = name
        }
    }

    public var touchUpHandler: (() -> Void)?

    private weak var button: NSButton!

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        configureView()
    }

    required public init?(coder: NSCoder) {
        super.init(coder: coder)
        configureView()
    }

    private func configureView() {
        let button = NSButton(title: name, target: self, action: #selector(didTapButton(_:)))
        button.bezelStyle = .regularSquare
        button.translatesAutoresizingMaskIntoConstraints = false
        addSubview(button)
        NSLayoutConstraint.activate([
            button.topAnchor.constraint(equalTo: topAnchor),
            button.leftAnchor.constraint(equalTo: leftAnchor),
            button.rightAnchor.constraint(equalTo: rightAnchor),
            button.bottomAnchor.constraint(equalTo: bottomAnchor)
        ])
        self.button = button
    }

    func didTapButton(_ sender: NSButton) {
        touchUpHandler?()
    }

}

然后我就这样使用它了:

@IBOutlet weak var myButton: MyButton!

override func viewDidLoad() {
    super.viewDidLoad()

    myButton.touchUpHandler = { [unowned self] in
        self.performSomeAction()
    }
}