我正在使用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 !!