Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OS X 10.10中的自定义NSControl类_Macos_Cocoa - Fatal编程技术网

Macos OS X 10.10中的自定义NSControl类

Macos OS X 10.10中的自定义NSControl类,macos,cocoa,Macos,Cocoa,我需要开发一个新的自定义NSControl。我能找到的所有指南和示例(包括文章)都是围绕NSCell构建的。但从10.10开始,NSControl上所有与单元格相关的消息都已被弃用 我尝试创建一个子类并通过IB中的自定义视图添加到我的项目中,但我无法让控件接受first responder,尽管已启用,将refusesFirstResponder设置为NO,并从acceptsFirstResponder返回YES。我确信我错过了很多应该存在的功能(值更改通知等) 是否有新的参考资料显示了现在应该

我需要开发一个新的自定义NSControl。我能找到的所有指南和示例(包括文章)都是围绕NSCell构建的。但从10.10开始,NSControl上所有与单元格相关的消息都已被弃用

我尝试创建一个子类并通过IB中的自定义视图添加到我的项目中,但我无法让控件接受first responder,尽管已启用,将refusesFirstResponder设置为NO,并从acceptsFirstResponder返回YES。我确信我错过了很多应该存在的功能(值更改通知等)


是否有新的参考资料显示了现在应该如何开发控制?如果有,我的谷歌fu会让我失望。谢谢

您的问题可能是您从未真正将控件设置为第一响应者。仅仅点击它不会自动完成。下面是一个快速的例子,它接受第一响应者的状态(点击也会变成如此),并绘制一个焦点环。确保启用控件并设置其目标和操作

class MyControl: NSControl {


    override var acceptsFirstResponder: Bool {
        return true
    }


    override func becomeFirstResponder() -> Bool {
        return true
    }


    override func mouseDown(with event: NSEvent) {
        window?.makeFirstResponder(self)
    }

    override func mouseUp(with event: NSEvent) {
        if let action = action {
            NSApp.sendAction(action, to: target, from: self)
        }
    }


    override func draw(_ dirtyRect: NSRect) {
        NSColor.white.set()
        NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()

        if window?.firstResponder == self {
            NSColor.keyboardFocusIndicatorColor.set()
        } else {
            NSColor.black.set()
        }
        NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).stroke()
    }


    override var focusRingMaskBounds: NSRect {
        return bounds.insetBy(dx: 1, dy: 1)
    }


    override func drawFocusRingMask() {
        NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()
    }

}

你有没有想过?我正试图处理同样的事情。谢谢。不,我从来没有这样做过——我把它放在一边去做其他事情,还没有回来。你能给我看一些代码吗?我关于子类化NSControl的现代参考的问题仍然存在;如果苹果发布了一篇更新的文章,我还没有偶然发现它。至于第一响应者:我离开了那个代码,采取了一种不同的方法,那是很久以前的事了,我记不起来了。如果排除NSCell,构建控件要简单得多。控件实际上与处理用户输入事件的任何其他视图没有任何不同。过去将它们分开的唯一一件事是它们使用NSCell作为事件和显示的主要机制,这样它们就可以在表视图等中工作。现在NSCell已经死了,很简单——只需使用NSView/NSResponder/NSControl API中提供的功能即可。我不确定一个新的导游会提供什么。