如果我创建一个空白的 Mac XCode 项目并NSView在主窗口中并排布局 500 个简单对象,它的加载速度会非常快。如果我wantsLayer=YES对每个子视图进行设置,性能会急剧下降几秒钟。为什么从概念上讲是这样的?看起来层会比常规的旧 NSView 更快而不是更慢。
我正在尝试显示不可见的字符,例如 NSTextView 子类中的换行符。像重写 NSLayoutManager 的 drawGlyph 方法这样的常用方法是一个坏主意,因为它太慢并且不能正常工作于多页布局。
\n\n我想要做的是重写 NSLayoutManager 的 setGlyph 方法,以便它将不可见的“\\n”字形替换为“\xc2\xb6”字形,将“ ”替换为“\xe2\x88\x99”。
\n\n它适用于“ ”空格字形,但对新行字符没有影响。
\n\npublic override func setGlyphs(_ glyphs: UnsafePointer<CGGlyph>, properties props: UnsafePointer<NSGlyphProperty>, characterIndexes charIndexes: UnsafePointer<Int>, font aFont: Font, forGlyphRange glyphRange: NSRange) {\n var substring = (self.currentTextStorage.string as NSString).substring(with: glyphRange)\n\n // replace invisible characters with visible\n if PreferencesManager.shared.shouldShowInvisibles == true {\n substring = substring.replacingOccurrences(of: " ", with: "\\u{00B7}")\n substring = substring.replacingOccurrences(of: "\\n", with: "u{00B6}")\n }\n\n // create a CFString\n let stringRef = substring as CFString\n let …Run Code Online (Sandbox Code Playgroud) UIKit 和 AppKit 仍然共享很多概念。就像“AppKit 包含为 macOS 应用程序实现用户界面所需的所有对象——窗口、面板、按钮、菜单、滚动条和文本字段”(来自 Apple 文档)。同样的 UIKit 支持用户界面。那么这两个框架之间的主要区别是什么。
在 Objective-C 中,我可以NSDragOperationNone从各种拖/放方法返回,以表明我不想处理给定的拖动。这是在 Apple 的 Docs 中明确列出的 Objective-C 版本NSDragOperation:
https://developer.apple.com/documentation/appkit/nsdragoperation?language=objc
但是,如果您查看 Swift 的该页面,或者查看NSDragOperationApple 的 Swift 标头中的定义,.none则不是一种选择。
那么...如何在 Swift 中拒绝拖动操作?在一个方法中,例如:
func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation
Run Code Online (Sandbox Code Playgroud)
1) 我明确地处理 AppKit 和 macOS,而不是 UIKit 或 iOS。
2) 我意识到我可以NSDragOperation使用原始0值init 进行初始化,这是NSDragOperationNone在 Objective-C 中赋予的值,但这很脆弱。什么是 Swift 减少阻力的方法?
我有一个基于文档的应用程序。我重写NSDocument'smakeWindowControllers以实例化自定义窗口控制器。它的初始化程序调用init(window: NSWindow?)其超类,即它不使用任何涉及 nib 文件的初始化程序。
如何进行级联工作(请参阅shouldCascadeWindows)?目前,每个窗口都在第一个屏幕上的相同位置打开。
我可以通过调用某些东西来重用现有的级联逻辑吗NSWindowController?
如果我必须自己手动实现,我应该如何最好地获取最顶层文档窗口的位置?文档的潜在多个窗口中的哪一个应该是计算偏移量的窗口?
我的 Swift 脚本在 macOS 上需要一个小助手 GUI。它只需要一个文本输入字段和一个确定按钮。
我不想为了这个小弹出窗口而走整个臃肿的 Xcode 路线。但是,Apple 的文档让我失望,因为我的 NSWindow 没有捕获键盘输入。帮助!
我想知道是否可以将 SwiftUI 视图加载到 NSView 中。我希望将 Windows 内容视图设置为 SwiftUI,但
window?.contentView = view视图为 SwiftUI 时似乎不可能
如何在代码中将分隔线添加到状态栏菜单?例如
let menu = NSMenu()
let editMenuItem = NSMenuItem()
editMenuItem.title = "Preferences..."
menu.addItem(editMenuItem)
let quitMenuItem = NSMenuItem()
quitMenuItem.title = "Quit"
menu.addItem(quitMenuItem)
self.statusBarItem.menu = menu
Run Code Online (Sandbox Code Playgroud)
在此示例中,我想在第一个和第二个项目之间添加一个分隔线。
我正在注释我的函数,@MainActor以确保可以从任何异步位置安全地调用它以触发 UI 更新。尽管如此,我还是遇到了一个错误,不知何故,UI 更新似乎是在后台线程上尝试的,即使(据我理解)该函数严格绑定到`@MainActor\xc2\xb4.
这是我的代码:
\n/// Dismisses the popup from its presenting view controller.\n@MainActor public func dismiss() {\n presentingViewController?.dismiss(self)\n}\nRun Code Online (Sandbox Code Playgroud)\n它是从 an 内部调用的,NSViewController它使用 监听某个事件NotificationCenter,然后在以下objc函数中启动解雇:
class MainWindowControllerVC: NSWindowController, NSWindowDelegate {\n override func windowDidLoad() {\n NotificationCenter.default.addObserver(self, selector: #selector(self.dismissVCastSharePopup), name: .NOTIF_DISMISS_POPUP, object: nil)\n }\n\n @objc private func dismissPopup() {\n // some other cleanup is happening here\n popup?.dismiss()\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我收到以下错误:
\n*** Terminating app due to uncaught exception \'NSInternalInconsistencyException\', reason: \'NSWindow drag …Run Code Online (Sandbox Code Playgroud) 是的 - 所以我创建了一本帮助手册,做了所有正确的事情,仔细检查了我plist和index.html文件,而我得到的只是臭名昭着的
所选主题目前不可用.
尝试打开帮助手册时,控制台中唯一的条目是简单的
3/8/15 1:23:42.467 PM HelpViewer[35015]: Couldn't find book with this ID: (null)
Run Code Online (Sandbox Code Playgroud)
没太大帮助.
然后去哪儿?Apple Help
是否有任何调试技巧?
记录打开?什么..?
appkit ×10
macos ×5
swift ×5
cocoa ×4
nsview ×2
actor ×1
apple-help ×1
cocoa-touch ×1
contentview ×1
drag ×1
ios ×1
nsdocument ×1
objective-c ×1
rootview ×1
swiftui ×1
uikit ×1
xcode ×1