简体   繁体   English

NSButton 子类不发送事件

[英]NSButton Subclass not sending event

I'm subclassing NSButton and having a lot of trouble with what I thought would be pretty straight-forward.我正在继承 NSButton 并且在我认为非常简单的事情上遇到了很多麻烦。 I am close to where I need to be, visually, but the button no longer seems to send an event when pressed.我在视觉上接近我需要的位置,但按钮在按下时似乎不再发送事件。 This button is placed in IB and wired to an action in the containing view's controller class.这个按钮被放置在 IB 中并连接到包含视图的控​​制器类中的一个动作。

Here is the code for the custom NSButton and NSButtonCell classes.这是自定义 NSButton 和 NSButtonCell 类的代码。 You will see in the MouseUp function a few of the ways I have been trying to get this working.您将在 MouseUp 函数中看到一些我一直在尝试使其工作的方法。 The action and target seem to both be null, even though that info should be coming in from IB, I assumed...动作和目标似乎都为空,即使该信息应该来自 IB,我认为......

Shocked that this question has not been asked and answered a 100 times but if it has, I can't find it.震惊的是,这个问题没有被问过并回答了 100 次,但如果有,我找不到它。

Also, as a side-question, I notice that the ButtonCell concept seems to be deprecated.另外,作为一个附带问题,我注意到 ButtonCell 概念似乎已被弃用。 Advice on how to do this without using a button cell would also be appreciated!关于如何在不使用纽扣电池的情况下执行此操作的建议也将不胜感激!

import Cocoa

class TestButton: NSButton {
    static let buttonFont = NSFont(name: "Avenir-Black ", size: 14)!
    static let textColor = NSColor(red:0.84, green:1.00, blue:0.60, alpha:1.00)
    static let buttonColorActive = NSColor(red:0.43, green:0.72, blue:0.00, alpha:1.00)
    static let buttonColorDisabled = NSColor(red:0.72, green:0.86, blue:0.50, alpha:1.00)

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    override init(frame frameRect: NSRect) {
        super.init(frame:frameRect)
    }

    override class func cellClass() -> AnyClass? {
        return TestButtonCell.self
    }

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

    override func awakeFromNib() {
        // Replace Cell
        let oldCell = self.cell
        let cell = TestButtonCell(textCell: oldCell?.title ?? "TestButton" )
        self.cell = cell

        // Add Tracking
        let tracking = NSTrackingArea(rect: self.bounds, options: [NSTrackingAreaOptions.ActiveAlways ,NSTrackingAreaOptions.MouseEnteredAndExited] , owner: self, userInfo: nil)
        self.addTrackingArea(tracking)

        //Set Background Color
        setBGColor(TestButton.buttonColorActive)
        self.sendActionOn(NSEventMask.LeftMouseUp)
    }

    func setBGColor(color:NSColor){
        if let cell = cell as? TestButtonCell {
            cell.setBGColor(color)
        }
    }

    //Mouse Functions
    override func mouseEntered(event: NSEvent) {
        setBGColor(TestButton.buttonColorDisabled)
    }
    override func mouseExited(event: NSEvent) {
        setBGColor(TestButton.buttonColorActive)
    }

    override func mouseDown(theEvent: NSEvent) {
        self.highlighted = true
        super.mouseDown(theEvent)
        self.mouseUp(theEvent)

    }

    override func mouseUp(theEvent: NSEvent) {
        super.mouseUp(theEvent)
//      Swift.print(self.action, self.target)
//      Swift.print(self.cell?.action, self.cell?.target)
//      sendAction(self.action, to:self)
//      self.performClick(self)
    }
}


class TestButtonCell:NSButtonCell {
    func setBGColor(color:NSColor){
        self.backgroundColor = color
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init(textCell string: String) {
        super.init(textCell: string)

        self.bordered = false

        let style = NSMutableParagraphStyle()
        style.alignment = .Center
        let attributes = [
            NSForegroundColorAttributeName: TestButton.textColor,
            NSFontAttributeName: TestButton.buttonFont,
            NSParagraphStyleAttributeName: style
            ] as [String : AnyObject]

        let attributedTitle = NSAttributedString(string: title, attributes: attributes)
        self.attributedTitle = attributedTitle
    }
}

Figured this out.想通了这一点。 I was not calling super.awakeFromNib(), and I also needed to preserve the original NSButtonCell's action and target before nuking it.我没有调用 super.awakeFromNib(),而且我还需要在使用之前保留原始 NSButtonCell 的动作和目标。 I'm going to ditch the cell though - seems totally unneeded.不过我要放弃牢房——似乎完全不需要。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM