在AppKit上,菜单项和工具栏项分别具有validateMenuItem(_:)和validateToolbarItem(_:)。然而,通过新的触摸条项目,没有这样方便的方法来验证合适的项目在适当的时候。
现在,每当我更改相关值并在didSet中调用验证方法时,我都会验证触摸条项(参见下面的示例代码)。但是我觉得这不是一个好的方法,因为相关的值必须知道有一个触摸条项目取决于它。
var foo: Foo? {
didSet {
if #available(macOS 10.12.1, *), NSClassFromString("NSTouchBar") != nil {
self.validateTouchBarItem(identifier: .foo)
}
}
}
@available(macOS 10.12.1, *)
func validateTouchBarItem(identifier: NSTouchBarItemIdentifier) {
guard
let item = self.touchBar?.item(forIdentifier: identifier),
let button = item.view as? NSButton
else { return }
switch identifier {
case NSTouchBarItemIdentifier.foo:
button.isEnabled = (self.foo != nil)
default: break
}
}我使用的另一种方法是Cocoa绑定和KVO,然而,它并不总是工作得很好。
因此,我很好奇是否有任何推荐的或事实上的标准方法来验证触摸条项,特别是包含NSButton和NSSegmentedControl的。我不仅想改变物品的可用性,而且有时还会根据情况改变它们的图像或颜色。你们是如何验证触摸栏项目的?
发布于 2016-11-27 08:00:39
我自己改进了我的触摸屏验证系统,并做了以下的协议和扩展。
@available(macOS 10.12.1, *)
protocol TouchBarItemValidations: class {
func validateTouchBarItem(_ item: NSTouchBarItem) -> Bool
}
@available(macOS 10.12.1, *)
extension NSTouchBarProvider {
func validateTouchBarItems() {
guard NSClassFromString("NSTouchBar") != nil else { return } // run-time check
guard let touchBar = self.touchBar else { return }
// validate currently visible touch bar items
for identifier in touchBar.itemIdentifiers {
guard let item = touchBar.item(forIdentifier: identifier) as? NSCustomTouchBarItem else { continue }
item.validate()
}
}
}
@available(macOS 10.12.1, *)
extension NSCustomTouchBarItem: NSValidatedUserInterfaceItem {
func validate() {
// validate content control
if let control = self.control,
let action = control.action,
let validator = NSApp.target(forAction: action, to: control.target, from: self)
{
if let validator = validator as? TouchBarItemValidations {
control.isEnabled = validator.validateTouchBarItem(self)
} else if let validator = validator as? NSUserInterfaceValidations {
control.isEnabled = (validator as AnyObject).validateUserInterfaceItem(self)
}
}
}
// MARK: Validated User Interface Item Protocol
public var action: Selector? {
return self.control?.action
}
public var tag: Int {
return self.control?.tag ?? 0
}
// MARK: Private Methods
private var control: NSControl? {
return self.view as? NSControl
}
}
@available(macOS 10.12.1, *)
extension AppDelegate {
func applicationDidUpdate(_ notification: Notification) {
// validate touch bar items
if #available(macOS 10.12.1, *) {
if let window = NSApp.mainWindow {
for responder in sequence(first: window.firstResponder, next: { $0.nextResponder }) {
responder.validateTouchBarItems()
}
}
}
}
}如果您已经拥有AppDelegate的applicationDidUpdate(:_),您应该修改它,但除此之外,没有什么要添加的复杂内容。您现在可以使用validateTouchBarItem(_:)或普通validateUserInterfaceItem(_:)来验证您自己的触摸条项!
我想,至少对我的要求来说,这是很好的。
https://stackoverflow.com/questions/40799131
复制相似问题