SwiftUI 按钮,在 AppKit 中扩展并接受键盘快捷键
Posted
技术标签:
【中文标题】SwiftUI 按钮,在 AppKit 中扩展并接受键盘快捷键【英文标题】:SwiftUI Button, that expands and accepts keyboard-shortcuts in AppKit 【发布时间】:2021-01-05 10:24:35 【问题描述】:我需要构建这样的布局,并且按钮应接受键盘快捷键(AppKit):
在Let use a button all available width in SwiftUI on MacOS AppKit 我找到了一个解决方案,它创建了布局,但是这个 ExpandingButton 不接受键盘快捷键 - 可能是因为它是一个 HStack。
另一个想法,在上面的帖子中提出给标准按钮一个 .frame(maxWidth: .infinity) 修饰符对我不起作用。
struct TEST: View
let columns = [
GridItem(.flexible()),
GridItem(.flexible()),
GridItem(.flexible())
]
let data = ["1 Text ...",
"2 longer Text ...",
"3 Text ...",
"4 Text/FA/Tra",
"5 Text ...",
"6 Text ...",
"7 Text ...",
"8 Text ...",
"9 Text ...",
]
var body: some View
VStack (alignment: .leading )
LazyVGrid(columns: columns)
ForEach(data.indices, id: \.self) index in
ExpandingButton(text:data[index],action: print("pressed \(index)"))
.keyboardShortcut(KeyEquivalent(Character(UnicodeScalar(0x0030+index)!)) , modifiers: [.command])
.padding(.horizontal)
ExpandingButton(s: "Hogo")print("hogo")
ExpandingButton(s: "Hogo")print("hogo")
ExpandingButton(s: "Hogo")print("hogo")
struct ExpandingButton: View
var s : String
var action: ()->Void
var body: some View
HStack (alignment: .top)
Spacer()
Text(s)
.padding(4)
Spacer()
.background(Color.gray)
.cornerRadius(4)
.onTapGesture action()
【问题讨论】:
【参考方案1】:您可以将ExpandingButton
内容放在一个Button 中,然后keyboardShortcut
将按预期工作:
struct ExpandingButton: View
var s: String
var action: () -> Void
var body: some View
Button(action: action)
HStack(alignment: .top)
Spacer()
Text(s)
.padding(4)
Spacer()
.background(Color.gray)
.cornerRadius(4)
或者,您可以删除 ExpandingButton
并只使用 标准 Button
:
VStack(alignment: .leading)
LazyVGrid(columns: columns)
ForEach(data.indices, id: \.self) index in
Button(action: print("pressed \(index)") )
Text(data[index])
.keyboardShortcut(KeyEquivalent(Character(UnicodeScalar(0x0030 + index)!)), modifiers: [.command])
.frame(maxWidth: .infinity)
.padding(.horizontal)
...
【讨论】:
以上是关于SwiftUI 按钮,在 AppKit 中扩展并接受键盘快捷键的主要内容,如果未能解决你的问题,请参考以下文章
AppKit 上的 SwiftUI - 在弹出窗口中将焦点设置为 TextField
从 AppKit NSButton 打开新的 SwiftUI 窗口
将 AppKit/UIKit 中的 Key-Value Observation 转换为 Combine 和 SwiftUI
如何在 AppKit 上的自定义 SwiftUI 表单中右对齐项目标签?
在 NSViewControllerRepresentable 中使用 SwiftUI Coordinator 和 NSTableView?