我有一个状态栏应用程序,它在菜单栏中运行.因此,我设置Application is agent (UIElement)到true的info.plst.这导致我的应用程序没有停靠图标和菜单栏.
但是,我还有一个用户可以从状态栏菜单打开的首选项窗口.这是我打开它的方式:
if (!NSApp.setActivationPolicy(.regular)) {
print("unable to set regular activation policy")
}
NSApp.activate(ignoringOtherApps: true)
if let window = preferencesWindowController.window {
window.makeKeyAndOrderFront(nil)
}
Run Code Online (Sandbox Code Playgroud)
该窗口按预期显示,但应用程序的主菜单栏包含文件,编辑等,但未显示.只有当我点击另一个应用程序并返回我的应用程序时,才会显示菜单栏.
我注意到,如果我更改info.plstto中的值false并使用NSApp.setActivationPolicy(.accessory)in applicationDidFinishLaunching(),则它具有相同的结果.但是,如果我在调用NSApp.setActivationPolicy(.accessory)后几毫秒调用一个计时器applicationDidFinishLaunching(),它就可以工作,并且主菜单正在按预期显示.然而,这有副作用,即应用程序图标在停靠栏中弹出几秒钟(直到计时器被触发),这不是一个很好的用户体验.
有谁知道我还能尝试什么?切换活动应用时发生了什么,我在代码中没做什么?
我在macOS 10.12.2(16C67)上使用版本8.2.1(8C1002)
谢谢!
在 macOS 10.15 Catalina 中,安全系统首选项中有一个名为Input Monitoring的新部分。
它说:
即使在使用其他应用程序时,也允许以下应用程序监控来自键盘的输入。
我想知道这背后是哪个 API 将应用程序引入本节。
我知道AXIsProcessTrustedWithOptions(),它向输入监控上方的辅助功能部分添加了一个应用程序。然后我可以用来观看来自其他应用程序的按键。但是输入监控有什么用呢?NSEvent.addGlobalMonitorForEvents(matching: .keyDown, handler: self.keyDown(event:))
看起来手动将应用程序添加到输入监控不允许您使用NSEvent.addGlobalMonitorForEvents(...).
像 Steam 这样的应用程序在更新到 Catalina 后已被放入该部分,所以必须有一些东西告诉系统将它们放在那里......
我试图用SwiftUI重新创建每个人从UITableView知道的东西:tableview标题中的一个简单搜索字段:
但是,SwiftUI中的列表视图似乎甚至没有添加页眉或页脚的方法。您可以将带有TextField的标题设置为以下部分:
@State private var searchQuery: String = ""
var body: some View {
List {
Section(header:
Group{
TextField($searchQuery, placeholder: Text("Search"))
.background(Color.white)
}) {
ListCell()
ListCell()
ListCell()
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这是否是最佳方法,因为:
有没有人找到好的方法?我不想依靠UITableView。
在 macOS 11 中,Apple 引入了一个名为 NSToolbarItem 的新 NSToolbarItem NSSearchToolbarItem,当焦点切换到工具栏项时,它会自动调整大小以适应输入。
Apple 在此表示这与旧版本的 macOS 向后兼容:https : //developer.apple.com/wwdc20/10104(11:50 分钟)
但是,NSSearchToolbarItem在 macOS 10.13 (High Sierra) 上使用from interface builder启动我的应用程序时,我的应用程序会因以下应用程序特定信息而崩溃:
*** 由于未捕获的异常“NSInvalidUnarchiveOperationException”而终止应用程序,原因:“*** -[NSKeyedUnarchiver decodeObjectForKey:]:无法为密钥(NS.objects)解码类(NSSearchToolbarItem)的对象;该类可以在源代码或未链接的库中定义,并以 NSException 类型的未捕获异常终止
在 10.15 上启动它可以正常工作。我还没有能够测试 10.14。
Thomas Tempelmann 于 7 月 21 日更新
事实证明,这是旧 Xcode 12 版本的错误,现在已在 Xcode 12.5.1 中修复。
我已经开了一个赏金,因为我有一个看似相关的问题与高塞拉利昂运行时工具栏里面NSSegmentedControls的规格选择不当,但事实证明,这是一个单独的问题(这可以通过手动重置工具栏的固定minSize,并maxSize以控件frame.size)。
因此,解决方案是使用 Xcode 12.5.1 或更高版本。
我想展示具有多个选项的共享菜单。我创建了一个菜单并添加了所有 ShareLink 视图。我可以点击共享按钮,但如果我选择共享链接,则不会发生任何情况。没有错误消息。
这是我能想到的创建这样一个“共享菜单”的唯一方法:
ToolbarItemGroup(placement: SwiftUI.ToolbarItemPlacement.navigationBarTrailing) {
Menu {
ShareLink(
item: URL(string: "https://www.apple.com")!,
preview: SharePreview(
"Test 123",
image: Image(systemName: "plus")
)
)
ShareLink(
item: URL(string: "https://www.microsoft.com")!,
preview: SharePreview(
"Tests 321",
image: Image(systemName: "minus")
)
)
} label: {
Image(systemName: "square.and.arrow.up")
}
}
Run Code Online (Sandbox Code Playgroud)
我有这个简单的 SwiftUI 代码。我希望所有符号都居中对齐,就像云符号一样。
struct ContentView : View {
var body: some View {
HStack(alignment: .center, spacing: 10.0) {
Image(systemName: "cloud.sun")
Image(systemName: "cloud")
Image(systemName: "cloud.bolt")
Text("Text")
}.font(.title)
}
}
Run Code Online (Sandbox Code Playgroud)
但是正如您在下面看到的,第一个和最后一个符号没有居中。我错过了什么,还是这是一个错误?
干杯!
我想NavigationSplitView在 macOS 上隐藏/显示 a 的详细信息拆分视图。
不过NavigationSplitViewVisibility似乎没有这样的选择。更改.navigationSplitViewColumnWidth()或.frame()对详细信息视图没有影响,尽管它适用于内容和列表视图。
NavigationSplitView {
List(selection: $selection)
} content: {
content(for: selection)
} detail: {
Text("Detail")
}
Run Code Online (Sandbox Code Playgroud)
苹果是否忘记实现这样的功能?:/
我的应用程序使用石英过滤器将PDF文档中的图像转换为黑白图像:
PDF Document *pdfDocument = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:@"/Users/dan/Desktop/test.pdf"]];
QuartzFilter *quartzFilter = [QuartzFilter quartzFilterWithURL:[[NSBundle mainBundle] URLForResource:@"Black & White" withExtension:@"qfilter"]];
NSDictionary *options = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:quartzFilter, nil] forKeys:[NSArray arrayWithObjects:@"QuartzFilter", nil]];
[pdfDocument writeToFile:@"/Users/dan/Desktop/testResault.pdf" withOptions:options];
Run Code Online (Sandbox Code Playgroud)
不幸的是,在应用过滤器的情况下将文件写入磁盘会导致许多内存泄漏,如下所示:

这是Quartz Framework中的一个错误,还是我在上面的代码中做错了什么?
如果你想,你可以在这里下载我的测试项目:http://www.file-upload.net/download-7293644/PDF---Quartz-Memory-Leak.zip.html
我正在使用ARC.
iOS和macOS具有称为“通用剪贴板”的内置功能,该功能可使用iCloud在设备之间同步剪贴板的内容。
NSPasteboard.general.clearContents()
NSPasteboard.general.writeObjects("Test 123")
Run Code Online (Sandbox Code Playgroud)
我想在Cocoa应用程序的通用粘贴板上写一些东西,以便在不与其他iCloud设备同步的情况下在应用程序之间共享它。我找不到解决方法。实际上,我认为如果没有用户在设置中手动禁用它,这是不可能的。
文档说:
通用粘贴板(通过通用类方法提供)可自动参与macOS 10.12和更高版本以及iOS 10.0和更高版本中的通用剪贴板功能。没有用于与此功能交互的macOS API。 https://developer.apple.com/documentation/appkit/nspasteboard
但是,也许有一种解决方法,私有API(我知道没有App Store)或其他人可能知道的东西。:)
干杯
macos ×6
cocoa ×4
swiftui ×4
swift ×3
ios ×2
pdf ×2
clipboard ×1
ios5 ×1
menu ×1
menubar ×1
nspasteboard ×1
nstoolbar ×1
objective-c ×1
poppler ×1
search ×1
sf-symbols ×1
textfield ×1
uitableview ×1