标签: appkit

NSView的wantLayer表现

如果我创建一个空白的 Mac XCode 项目并NSView在主窗口中并排布局 500 个简单对象,它的加载速度会非常快。如果我wantsLayer=YES对每个子视图进行设置,性能会急剧下降几秒钟。为什么从概念上讲是这样的?看起来层会比常规的旧 NSView 更快而不是更慢。

macos cocoa nsview appkit

4
推荐指数
1
解决办法
1265
查看次数

无论我做什么,NSLayoutManager 都会隐藏新行字符

我正在尝试显示不可见的字符,例如 NSTextView 子类中的换行符。像重写 NSLayoutManager 的 drawGlyph 方法这样的常用方法是一个坏主意,因为它太慢并且不能正常工作于多页布局。

\n\n

我想要做的是重写 NSLayoutManager 的 setGlyph 方法,以便它将不可见的“\\n”字形替换为“\xc2\xb6”字形,将“ ”替换为“\xe2\x88\x99”。

\n\n

它适用于“ ”空格字形,但对新行字符没有影响。

\n\n
public 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)

cocoa cocoa-touch nslayoutmanager appkit swift

4
推荐指数
1
解决办法
2077
查看次数

AppKit 和 UIKit 有什么区别?

UIKit 和 AppKit 仍然共享很多概念。就像“AppKit 包含为 macOS 应用程序实现用户界面所需的所有对象——窗口、面板、按钮、菜单、滚动条和文本字段”(来自 Apple 文档)。同样的 UIKit 支持用户界面。那么这两个框架之间的主要区别是什么。

macos uikit appkit ios

4
推荐指数
2
解决办法
8358
查看次数

斯威夫特:NSDragOperationNone 在哪里?

在 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 减少阻力的方法?

drag-and-drop drag appkit swift

4
推荐指数
1
解决办法
358
查看次数

自定义 NSWindowController 中的级联

我有一个基于文档的应用程序。我重写NSDocument'smakeWindowControllers以实例化自定义窗口控制器。它的初始化程序调用init(window: NSWindow?)其超类,即它不使用任何涉及 nib 文件的初始化程序。

如何进行级联工作(请参阅shouldCascadeWindows)?目前,每个窗口都在第一个屏幕上的相同位置打开。

我可以通过调用某些东西来重用现有的级联逻辑吗NSWindowController

如果我必须自己手动实现,我应该如何最好地获取最顶层文档窗口的位置?文档的潜在多个窗口中的哪一个应该是计算偏移量的窗口?

nsdocument appkit nswindowcontroller

4
推荐指数
1
解决办法
587
查看次数

命令行 Swift 脚本的最小可行 GUI 是什么?

我的 Swift 脚本在 macOS 上需要一个小助手 GUI。它只需要一个文本输入字段和一个确定按钮。

我不想为了这个小弹出窗口而走整个臃肿的 Xcode 路线。但是,Apple 的文档让我失望,因为我的 NSWindow 没有捕获键盘输入。帮助!

macos cocoa appkit swift

4
推荐指数
1
解决办法
700
查看次数

有没有办法将 swiftUI 视图加载到 NSView 中?

我想知道是否可以将 SwiftUI 视图加载到 NSView 中。我希望将 Windows 内容视图设置为 SwiftUI,但 window?.contentView = view视图为 SwiftUI 时似乎不可能

nsview appkit rootview swiftui contentview

4
推荐指数
1
解决办法
2258
查看次数

macOS:在 NSMenu NSMenuItem 之间添加分隔线?

如何在代码中将分隔线添加到状态栏菜单?例如

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)

在此示例中,我想在第一个和第二个项目之间添加一个分隔线。

macos appkit swift

4
推荐指数
1
解决办法
1158
查看次数

尽管有 @MainActor 注释,但主线程上未触发 UI 更新

我正在注释我的函数,@MainActor以确保可以从任何异步位置安全地调用它以触发 UI 更新。尽管如此,我还是遇到了一个错误,不知何故,UI 更新似乎是在后台线程上尝试的,即使(据我理解)该函数严格绑定到`@MainActor\xc2\xb4.

\n

这是我的代码:

\n
/// Dismisses the popup from its presenting view controller.\n@MainActor public func dismiss() {\n    presentingViewController?.dismiss(self)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

它是从 an 内部调用的,NSViewController它使用 监听某个事件NotificationCenter,然后在以下objc函数中启动解雇:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

我收到以下错误:

\n
*** Terminating app due to uncaught exception \'NSInternalInconsistencyException\', reason: \'NSWindow drag …
Run Code Online (Sandbox Code Playgroud)

macos appkit actor swift swift-concurrency

4
推荐指数
1
解决办法
882
查看次数

调试帮助手册("所选主题​​当前不可用")

是的 - 所以我创建了一本帮助手册,做了所有正确的事情,仔细检查了我plistindex.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
是否有任何调试技巧
记录打开?什么..?

xcode cocoa objective-c appkit apple-help

3
推荐指数
1
解决办法
736
查看次数