gpt4 book ai didi

swift - 未触发 NSToolbarItem 的操作

转载 作者:行者123 更新时间:2023-11-28 15:23:26 25 4
gpt4 key购买 nike

我是 macOS 编程的新手,想为 NSToolbarItem 实现自定义类。每次按下该项目时,我都想更改该类的一个属性。这是一个示例代码:

class CustomToolbarButton: NSToolbarItem
{
override init(itemIdentifier: String)
{
super.init(itemIdentifier: itemIdentifier)
super.target = self
super.action = #selector(reactToPress)
}

func reactToPress(sender: NSToolbarItem)
{
toggled_property = !toggled_property
print("Item pressed")
}

private(set) var toggled_property = true;
}

此类被插入 Storyboard的工具栏中。我已确保将身份检查器中的类说明符更改为 CustomToolbarButton。然而,操作似乎从未被触发,因为“Item pressed”从未出现在控制台输出中。

我还尝试通过以下方式声明“reactToPress”函数:

func reactToPress()
@objc func reactToPress()
@objc func reactToPress(sender: NSToolbarItem)

还是没有成功。

最佳答案

您需要对项目的目标进行非弱引用。试试这个:

// Define this in your class.
static let itemTarget = CustomToolbarButton(itemIdentifier: "myButton")

// and use it when setting the target in the constructor.
self.target = CustomToolbarButton.itemTarget

来自 docs.swift.org“弱引用是一种引用,它不会对其引用的实例保持强控制,因此不会阻止 ARC 处理引用的实例。”

如果对该实例的所有引用都是弱引用,则该项目会自动创建和释放。您至少需要一个非弱引用来保留实例。

推荐阅读: https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

此外,如您所述, Action 函数中需要@objc 指令。这里有一些有用的链接。

'#selector'指的是一个没有暴露给Objective-C的方法 '#selector' refers to a method that is not exposed to Objective-C

参见选择器表达式 https://docs.swift.org/swift-book/ReferenceManual/Expressions.html

最后是 Xcode 10.3 和 Swift 5 上的工作示例:

//  Created by Juan Miguel Pallares Numa on 9/12/19.
// Copyright © 2019 Juan Miguel Pallares Numa. All rights reserved.

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

// Strong reference.
var myWindowController = WindowController()

func applicationDidFinishLaunching(_ aNotification: Notification) {
myWindowController.makeWindowKeyAndOrderFront()
}
}

import Cocoa

class ToolbarController: NSObject, NSToolbarDelegate {

let identifiers = [NSToolbarItem.Identifier("myIdentifier")]
let toolbar = NSToolbar()
let toolbarItem: NSToolbarItem

override init() {
toolbarItem = NSToolbarItem(itemIdentifier: identifiers[0])
super.init()
toolbar.delegate = self

toolbarItem.label = "Print My Console Message"
toolbarItem.target = self
toolbarItem.action = #selector(
ToolbarController.toolbarAction(_:))
toolbarItem.image = NSImage(named: NSImage.applicationIconName)!
}

@objc func toolbarAction(_ sender: Any?) {
print("Hello world")
}

func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return identifiers
}

func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return identifiers
}

func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
return identifiers
}

func toolbar(_ toolbar: NSToolbar,
itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier,
willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {

return toolbarItem
}
}

import Cocoa

class WindowController: NSWindowController {

var toolbarController = ToolbarController()

convenience init() {
let window = NSWindow(
contentViewController: ViewController())

self.init(window: window)

window.toolbar = toolbarController.toolbar
}

func makeWindowKeyAndOrderFront() {
window?.makeKeyAndOrderFront(nil)
}
}

import Cocoa

class ViewController: NSViewController {

override func loadView() {
view = NSView(frame: NSRect(x: 0, y: 0, width: 400, height: 300))
}
}

关于swift - 未触发 NSToolbarItem 的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45597665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com