繁体   English   中英

NSButton 子类不发送事件

[英]NSButton Subclass not sending event

我正在继承 NSButton 并且在我认为非常简单的事情上遇到了很多麻烦。 我在视觉上接近我需要的位置,但按钮在按下时似乎不再发送事件。 这个按钮被放置在 IB 中并连接到包含视图的控​​制器类中的一个动作。

这是自定义 NSButton 和 NSButtonCell 类的代码。 您将在 MouseUp 函数中看到一些我一直在尝试使其工作的方法。 动作和目标似乎都为空,即使该信息应该来自 IB,我认为......

震惊的是,这个问题没有被问过并回答了 100 次,但如果有,我找不到它。

另外,作为一个附带问题,我注意到 ButtonCell 概念似乎已被弃用。 关于如何在不使用纽扣电池的情况下执行此操作的建议也将不胜感激!

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
    }
}

想通了这一点。 我没有调用 super.awakeFromNib(),而且我还需要在使用之前保留原始 NSButtonCell 的动作和目标。 不过我要放弃牢房——似乎完全不需要。

暂无
暂无

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

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