У меня есть Alert в моем SwiftUI приложении:
.alert("Project Name:", isPresented: self.$alertPresented)
{
TextField("", text: self.$userInput)
/*.onSubmit
{
okButtonPushed()
self.alertPresented = false
}*/
Button("Cancel", role: .cancel) { }
Button("OK")
{
okButtonPushed()
}
.disabled(userInput.isEmpty)//.keyboardShortcut(.return)
}
Он работает нормально, но я пытаюсь сделать так, чтобы, когда пользователь нажимал клавишу возврата или ввода в MacOS, это было так же, как если бы пользователь нажимал кнопку «ОК» Button. Я также хочу, чтобы кнопка «ОК» Button была выделена, чтобы пользователю было понятно, что он может нажать «Ввод/Ввод», чтобы активировать его.
До сих пор я пробовал два разных подхода. Во-первых, я прикрепил .onSubmit к TextField. Когда я нажимаю Enter или Return, это работает, но не отменяет Alert (даже если я устанавливаю $self.alertPresented на false.
Во-вторых, я пытался прикрепить .keyboardShortcut(.return) к самому ОК Button, но все, что он делает, это по какой-то причине выделяет отмену Button (во многом так же, как я хочу выделить ОК Button), и когда я нажимаю кнопку возврата/или ввода , Alert исчезает, как будто кто-то нажал кнопку «Отмена» Button.
Итак, просто интересно, возможно ли это в том формате, который у меня есть выше, где у Alert есть TextField и когда все это делается в вложении .alert, прикрепленном к Button. Спасибо.
@workingdogsupportUkraine Спасибо за тестирование, мне придется еще раз проверить, что я делал не так, оно просто не исчезнет.





Вы ищете сочетание клавиш .defaultAction.
Стандартное сочетание клавиш для кнопки по умолчанию, состоящее из клавиши возврата (↩) и без модификаторов.
В macOS кнопка по умолчанию обозначена специальным цветом. Если этому ярлыку назначено более одного элемента управления, выделяется только первый из них.
.alert("Project Name:", isPresented: self.$alertPresented)
{
TextField("", text: self.$userInput)
Button("OK") { print("OK Pressed!") }
.disabled(userInput.isEmpty)
.keyboardShortcut(.defaultAction)
Button("Cancel", role: .cancel) { }
}
Обратите внимание, что кнопку «Отмена» следует разместить после кнопки «ОК». Похоже, что кнопка с role: .cancel также неявно является .defaultAction, поэтому нам нужно сначала поместить кнопку ОК, чтобы выделить ее.
Прохладный! Странно, что кнопка ОК все еще появляется справа, хотя мы изменили порядок в коде, но теперь она делает именно то, на что я надеялся, спасибо!
Подход .onSubmit{...} работает для меня в моем тесте,
предупреждение закрывается, когда я нажимаю клавишу возврата.
Обратите внимание на незначительное изменение для macOS.
Протестировано на macOS 15 и iOS 18.
Пример кода:
struct ContentView: View {
@State private var alertPresented = false
@State private var userInput = ""
var body: some View {
VStack (spacing: 55) {
Button("Show alert") {
alertPresented = true
}
Text("testing")
.alert("Project Name:", isPresented: $alertPresented) {
TextField("", text: $userInput)
.onSubmit {
#if !os(macOS)
okButtonPushed("onSubmit")
#endif
alertPresented = false
}
Button("Cancel", role: .cancel) { }
Button("OK") {
okButtonPushed("button")
}
.disabled(userInput.isEmpty)
}
}
}
// for testing
func okButtonPushed(_ str: String) {
print("----> okButtonPushed from \(str)")
}
}
подход
.onSubmit{...}работает для меня в моем тесте, предупреждение закрывается, когда я нажимаю клавишу возврата.