SwiftUI -使用Toggle switch切换键盘类型(默认/数字)?



我正在使用SwiftUI在iOS中创建一个应用程序设置屏幕,用户将输入密码,然后确认它。我已经为我的键盘创建了一个ToolbarItemGroup,它将允许用户使用Toggle控件在数字密码和复杂密码之间切换。我希望能够切换UIKeyboardType以匹配Toggle开关的值,但我没有看到它如预期的那样更新。下面是我的代码到目前为止的样子:

SecureField("Master Password", text: $viewModel.password)
.modifier(NoAutocapitalizationViewModifier())
.padding()
.overlay(RoundedRectangle(cornerRadius: 10.0).strokeBorder(Color.blue, style: StrokeStyle(lineWidth: 2.0)))
.padding([.horizontal])
.frame(maxWidth: .infinity)
.keyboardType(viewModel.isAlphaNumeric ? .default : .numberPad)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()

Toggle("Complex Password", isOn: $viewModel.isAlphaNumeric)
.toggleStyle(.switch)
}
}
SecureField("Confirm Password", text: $viewModel.confirmPassword)
.modifier(NoAutocapitalizationViewModifier())
.padding()
.overlay(RoundedRectangle(cornerRadius: 10.0).strokeBorder(Color.blue, style: StrokeStyle(lineWidth: 2.0)))
.padding([.horizontal])
.frame(maxWidth: .infinity)
.keyboardType(viewModel.isAlphaNumeric ? .default : .numberPad)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()

Toggle("Complex Password", isOn: $viewModel.isAlphaNumeric)
.toggleStyle(.switch)
}
}

可以看到,Toggle在我的ViewModel对象中更新了一个布尔值,以指示它是否是一个复杂的密码。但是,每当我更改开关的值时,我都没有看到.keyboardType值中反映的变化。如果我切换到确认密码;字段,然后向后移动,我看到键盘适当地改变了,但是当改变Toggle值时,它不会动态发生。

如何使UIKeyboardType值根据Toggle控件的值动态变化?

键盘一旦创建就可以被缓存,所以可以尝试如下操作(在任何需要的地方):

SecureField("Confirm Password", text: $viewModel.confirmPassword)
.modifier(NoAutocapitalizationViewModifier())
.padding()
.overlay(RoundedRectangle(cornerRadius: 10.0).strokeBorder(Color.blue, style: StrokeStyle(lineWidth: 2.0)))
.padding([.horizontal])
.frame(maxWidth: .infinity)
.keyboardType(viewModel.isAlphaNumeric ? .default : .numberPad)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()

Toggle("Complex Password", isOn: $viewModel.isAlphaNumeric)
.toggleStyle(.switch)
}
}
.id(viewModel.isAlphaNumeric)      // << here !!

最新更新