news 2026/10/10 6:00:48

swiftui-ui-patterns - focus

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
swiftui-ui-patterns - focus

焦点处理与字段串联

意图

使用@FocusState控制键盘焦点、串联字段,并在复杂表单中协调焦点。

核心模式

  • 使用枚举表示可聚焦的字段。
  • 在onAppear中设置初始焦点。
  • 使用.onSubmit将焦点移动到下一个字段。
  • 对于动态字段列表,使用带关联值的枚举(例如.option(Int))。

示例:单字段焦点

structAddServerView:View{@Stateprivatevarserver=""@FocusStateprivatevarisServerFieldFocused:Boolvarbody:someView{Form{TextField("Server",text:$server).focused($isServerFieldFocused)}.onAppear{isServerFieldFocused=true}}}

示例:用枚举串联焦点

structEditTagView:View{enumFocusField{casetitle,symbol,newTag}@FocusStateprivatevarfocusedField:FocusField?varbody:someView{Form{TextField("Title",text:$title).focused($focusedField,equals:.title).onSubmit{focusedField=.symbol}TextField("Symbol",text:$symbol).focused($focusedField,equals:.symbol).onSubmit{focusedField=.newTag}}.onAppear{focusedField=.title}}}

示例:可变字段的动态焦点

structPollView:View{enumFocusField:Hashable{caseoption(Int)}@FocusStateprivatevarfocused:FocusField?@Stateprivatevaroptions:[String]=["",""]@StateprivatevarcurrentIndex=0varbody:someView{ForEach(options.indices,id:\.self){indexinTextField("Option\(index+1)",text:$options[index]).focused($focused,equals:.option(index)).onSubmit{addOption(at:index)}}.onAppear{focused=.option(0)}}privatefuncaddOption(at index:Int){options.append("")currentIndex=index+1DispatchQueue.main.asyncAfter(deadline:.now()+0.01){focused=.option(currentIndex)}}}

应保留的设计选择

  • 让焦点状态保持在拥有字段的视图本地。
  • 用焦点变化驱动 UX(验证消息、辅助 UI)。
  • 使用 ScrollView/Form 时,配合.scrollDismissesKeyboard(...)。

陷阱

  • 不要把焦点状态存储在共享对象中;它是视图局部的。
  • 避免在动画期间激进地切换焦点;如有必要可延迟。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 6:00:19

【计算机毕业设计单片机案例】基于单片机的室内气压烟雾颗粒物检测与移动端远程提醒控制系统设计 基于单片机的本地与移动端协同管理多环境参数监测报警装置设计(030110)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/10/10 5:59:13

局域网内 Docker 部署 DeepSeek AI Agent 平台实战

1. 为什么要在局域网里自建 AI Agent 平台很多人第一次接触大模型,习惯直接开个网页版用。但真到团队协作、数据敏感、或者需要把 AI 能力嵌进内部工具链的时候,网页版就明显不够用了。你没法控制它的上下文长度,没法接自己的知识库&#xff…

作者头像 李华
网站建设 2026/10/10 5:58:26

Java工程师面试答疑:从背八股文到讲原理与取舍

见过太多简历写“熟悉Java、熟悉Spring、熟悉Redis”的候选人,一到追问环节就开始支支吾吾。前阵子有位读者“谢飞机”找我做面试答疑,他准备冲击互联网大厂Java工程师岗位,学历背景不算亮眼,项目经历也偏中小厂,典型的…

作者头像 李华
网站建设 2026/10/10 5:57:19

Marvell88Q5152交换机开发(10)-项目开发问题(一)

问题 问题:TCAM做doubletag过滤,当外标签时0x88A8时无法击中TCAM的规则。 如上图所示配置一个TCAM的黑名单,frame type=0(normal);outerTag=0x88A8,innerTag=0x8100/0x9100/任意,当收到的报文符合这个规则就Drop丢弃。 补充:每个port口有四个TCAM击中计数器,如果报…

作者头像 李华
网站建设 2026/10/10 5:57:06

Claude记忆增强实践:构建可寻址、可回溯的对话状态管理方案

1. “claude-mem”不是官方产品,而是一类社区自发构建的记忆增强实践最近在多个技术社区和开发者讨论组里,“claude-mem”这个词频繁出现,常和“Claude 3.5 Sonnet”“记忆持久化”“上下文断裂修复”“长对话状态保持”等短语一起被提及。它…

作者头像 李华
网站建设 2026/10/10 5:55:32

Android中的人脸检测入门:基于Google Play服务Vision库的完整实战

文档教程知识库 【免费下载链接】android-tech-frontier 【停止维护】一个定期翻译国外Android优质的技术、开源库、软件架构设计、测试等文章的开源项目 项目地址: https://gitcode.com/gh_mirrors/an/android-tech-frontier 点击查看 免费下载 本文译自 Android …

作者头像 李华