SwiftUI属性包装器之FocusState
所属分类:ios | 浏览:1015 | 发布于 2023-12-10
在iOS15中,SwiftUI提供了FocusState属性包装器,用来帮助我们判断该视图内的TextField是否获得焦点。通过focused将FocusState与特定的TextField关联起来。
先看代码:
在上面的代码中,我们定义了一个isEmailFocused的属性包装器,在TextField组件上添加focused()修饰符,并绑定到定义的isEmailFocused属性包装器,当TextField获取到焦点时,isEmailFocused被设置为true,当TextField失去焦点时,isEmailFocused被设置为false。
可以定义多个属性包装器,如下:
在上面的代码中,定义了两个FocusState属性包装器,用来管理email和password的状态。
再进一步,点击登录按钮发现字段为空时,字段自动获取焦点,如下:
在复杂的视图中定义很多个FocusState包装器会显得很麻烦,幸运的是,FocusState不仅支持Bool类型,还支持任何实现了Hashable协议的类型。这样,我们就可以定义一个实现了Hashable协议的enum类型来管理所有的focused状态。
示例代码如下:
在上面的代码中,任何一个焦点的改变都会更新到focus属性包装器上。
需要注意的是,Hashable enum类型的属性包装器必须设置为可选类型,因为在大部分时间这些元素都是没有焦点的。
传递@FocusState属性包装器给子视图
视图显示,立刻让指定的TextField获取焦点并弹出键盘