当前位置: 首页 > news >正文

网站建设关于深圳免费网站建设

网站建设关于,深圳免费网站建设,百度竞价排名官网,深圳电信网站备案0. 概览 这是一段非常简单的 SwiftUI 代码#xff0c;我们将 Item 数组传递到子视图并在子视图中对其进行修改#xff0c;修改的结果会立即在主视图中反映出来。 不幸的是#xff0c;当我们修改 Item 名称时却发现不能连续输入#xff1a;每次敲一个字符键盘都会立即收起并… 0. 概览 这是一段非常简单的 SwiftUI 代码我们将 Item 数组传递到子视图并在子视图中对其进行修改修改的结果会立即在主视图中反映出来。 不幸的是当我们修改 Item 名称时却发现不能连续输入每次敲一个字符键盘都会立即收起并且原输入焦点会马上丢失这是怎么回事呢 在本篇博文中您将学到以下内容 0. 概览1. 不该发生的错误2. 无效的尝试用子视图包装3. 寻根究底4. 解决之道总结 该问题这是初学者在 SwiftUI 开发中常常会犯的一个错误不过看完本篇之后相信大家都会对此自胸有成竹 废话不再Let‘s fix it 1. 不该发生的错误 照例我们先看一下源代码。 例子中我们创建了 Item 结构用来作为 Model 中的“真相之源”。 想要了解更多 SwiftUI 编程和“真相之源”奥秘的小伙伴们请观赏我专题专栏中的如下文章 『第十章』仪态万千的雨燕UIKit 和 SwiftUI 注意我们让 Item 遵守了 Identifiable 协议这样可以更好的适配 SwiftUI 列表中的显示 struct Item: Identifiable {var id: String {name}var name: Stringvar count: Int }let g_items: [Item] [.init(name: 宇宙魔方, count: 11),.init(name: 宝石手套, count: 1),.init(name: 大黄蜂, count: 1) ]接下来是主视图 ItemListView可以看到我们将 items 状态传递到子视图的 ForEach 循环中去了 struct ItemListView: View {State var items g_itemsprivate var total: Int {items.reduce(0) { $0 $1.count}}private var desc: [String] {items.reduce([String]()) { $0 [$1.name]}}var body: some View {NavigationStack {// 子视图 ForEach 循环...ForEach($items) { $item in// 代码马上来...}VStack {Text(desc.joined(separator: )).font(.title3).foregroundStyle(.pink)HStack {Text(宝贝总数量\(total)).font(.headline)Spacer().frame(width: 20)Button(所有 1){for idx in items.indices {guard items[idx].count 100 else { continue}items[idx].count 1}}.font(.headline).buttonStyle(.borderedProminent)}}.offset(y: 200)}} }最后是 ForEach 循环中的内容如下所示我们用单个 item 的值绑定来实现修改其内容的目的 ForEach($items) { $item inHStack {TextField(输入项目名称, text: $item.name).font(.title2.weight(.heavy))Text(数量\(item.count)).foregroundStyle(.gray)Slider(value: .init(get: {Double(item.count)}, set: {item.count Int($0)}), in: 0.0...100.0)} } .padding()这样一段看起来“天衣无缝”的代码为什么会出现在更改 Item 名称时键盘反复关闭、输入焦点丢失的问题呢 2. 无效的尝试用子视图包装 我们首先猜测是子视图中 Item 名称的更改导致了父视图的“冗余”刷新从而引起键盘不正确被重置。 更多 SwiftUI 和 Swift 代码调试的例子请观赏我专题专栏中的博文 『第十三章』雨燕的自我修养Swift 调试技巧上『第十四章』雨燕的自我修养Swift 调试技巧下 因为键盘所属的视图发生重建所以键盘本身也会被重置那么如何验证我们的猜测呢一种方式是使用如下的调试技术 SwiftUI 如何快速识别视图View界面的刷新是由哪个状态的改变导致的 在这里我们假设病根果真如此。那么一种常用的解决办法立即浮现于脑海我们可以将引起刷新的子视图片段包装在新的 View 结构中这样做到原因是 SwiftUI 渲染器足够智能可以只刷新子视图而不是父视图中大段内容的更改。 更详细的原理请参考如下链接 SwiftUI 中为什么应该经常用子视图替换父视图中的大段内容 So让我撸起袖子开动起来 首先将 ForEach 循环中编辑单个 Item 的 View 包装为一个新的视图 ItemEditView struct ItemEditView: View {Binding var item: Itemvar body: some View {HStack {TextField(输入项目名称, text: $item.name).font(.title2.weight(.heavy))Text(数量\(item.count)).foregroundStyle(.gray)Slider(value: .init(get: {Double(item.count)}, set: {item.count Int($0)}), in: 0.0...100.0)}} }接着我们将 ForEach 循环本身用一个新视图取代 struct EditView: View {Binding var items: [Item]var body: some View {ForEach($items) { $item inItemEditView(item: $item)}.padding()} }最后我们所要做的就是将父视图 ItemListView 中的 ForEach 循环变为 EditView 视图 NavigationStack {EditView(items: $items)// 其它代码不变... }再次运行代码…不幸的是问题依旧 看来这并不是简单父视图“过度”刷新的问题一定是有什么不应有的行为触发了父视图的刷新到底是什么呢 3. 寻根究底 问题一定出在 ForEach 循环里 回顾之前 Item 的定义我们用 Identifiable 协议满足 ForEach 对子项目唯一性的挑剔我们用 Item.name 构建了 id 属性。 当 Model 元素遵守 Identifiable 协议时应该确保在任意时刻所有 Item 的 id 属性值都是唯一的从目前来看上述代码在修改 Item 名称时并没有发生重名的情况虽然可能发生所以对于唯一性是没有问题的。 当然在实际代码中用户很可能会输入重复的 Item 名称所以还是不可接收的。 不过这段代码在这里只是作为例子来向大家展示解决问题的推理过程所以不必深究 但是 id 还有另一个重要的特征稳定性 一般的当 Identifiable 实体对象的 id 属性改变时SwiftUI 会认为其不再是同一个对象而立即刷新其所对应的视图界面。 所以正如大家所看到的那样每次用户输入 name 中的新字符时键盘会被立即关闭焦点也随即丢失 4. 解决之道 知道了问题原因解决起来就很容易了。 我们只需要在 Item 生命周期中保证 id 的稳定性就可以了这意味着不能再用 name 值作为 id 的“关联”值 struct Item: Identifiable {let id UUID()var name: Stringvar count: Int }如上代码所示我们在 Item 创建时为 id 生成一个唯一的 UUID 对象这可以保证两点 任意时刻 Item 的唯一性任意 Item 在其生命周期中的稳定性 有了如上修改之后我们再来运行代码看看结果 可以看到现在我们可以毫无问题的连续输入 Item 的名字了焦点不会再丢失一切回归正常棒棒哒 总结 在本篇博文中我们讨论了 SwiftUI 开发中一个非常常见的问题并借助一步步溯本回原的推理找到症结根本之所在最后一发入魂将其完美解决相信小伙伴们都能由此受益匪浅。 感谢观赏再会
文章转载自:
http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn
http://www.morning.bpmdn.cn.gov.cn.bpmdn.cn
http://www.morning.wnhml.cn.gov.cn.wnhml.cn
http://www.morning.bzsqr.cn.gov.cn.bzsqr.cn
http://www.morning.rgtp.cn.gov.cn.rgtp.cn
http://www.morning.wnqbf.cn.gov.cn.wnqbf.cn
http://www.morning.ssjee.cn.gov.cn.ssjee.cn
http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn
http://www.morning.ppdr.cn.gov.cn.ppdr.cn
http://www.morning.hkpn.cn.gov.cn.hkpn.cn
http://www.morning.lgznf.cn.gov.cn.lgznf.cn
http://www.morning.wsnjn.cn.gov.cn.wsnjn.cn
http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn
http://www.morning.bpmnq.cn.gov.cn.bpmnq.cn
http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn
http://www.morning.flfxb.cn.gov.cn.flfxb.cn
http://www.morning.pcshb.cn.gov.cn.pcshb.cn
http://www.morning.wwnb.cn.gov.cn.wwnb.cn
http://www.morning.wflpj.cn.gov.cn.wflpj.cn
http://www.morning.txlnd.cn.gov.cn.txlnd.cn
http://www.morning.wsxly.cn.gov.cn.wsxly.cn
http://www.morning.litao7.cn.gov.cn.litao7.cn
http://www.morning.kwyq.cn.gov.cn.kwyq.cn
http://www.morning.qbxdt.cn.gov.cn.qbxdt.cn
http://www.morning.lxfqc.cn.gov.cn.lxfqc.cn
http://www.morning.pntzg.cn.gov.cn.pntzg.cn
http://www.morning.yfpnl.cn.gov.cn.yfpnl.cn
http://www.morning.mlnzx.cn.gov.cn.mlnzx.cn
http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn
http://www.morning.jcjgh.cn.gov.cn.jcjgh.cn
http://www.morning.nhzxr.cn.gov.cn.nhzxr.cn
http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn
http://www.morning.nxcgp.cn.gov.cn.nxcgp.cn
http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn
http://www.morning.nysjb.cn.gov.cn.nysjb.cn
http://www.morning.xkjqg.cn.gov.cn.xkjqg.cn
http://www.morning.kgqww.cn.gov.cn.kgqww.cn
http://www.morning.bfbl.cn.gov.cn.bfbl.cn
http://www.morning.bqrd.cn.gov.cn.bqrd.cn
http://www.morning.wfbs.cn.gov.cn.wfbs.cn
http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn
http://www.morning.pwbps.cn.gov.cn.pwbps.cn
http://www.morning.nbiotank.com.gov.cn.nbiotank.com
http://www.morning.gsyns.cn.gov.cn.gsyns.cn
http://www.morning.hkysq.cn.gov.cn.hkysq.cn
http://www.morning.fbmjw.cn.gov.cn.fbmjw.cn
http://www.morning.burpgr.cn.gov.cn.burpgr.cn
http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn
http://www.morning.zwppm.cn.gov.cn.zwppm.cn
http://www.morning.dbrdg.cn.gov.cn.dbrdg.cn
http://www.morning.nykzl.cn.gov.cn.nykzl.cn
http://www.morning.jfbrt.cn.gov.cn.jfbrt.cn
http://www.morning.zmlbq.cn.gov.cn.zmlbq.cn
http://www.morning.fhbhr.cn.gov.cn.fhbhr.cn
http://www.morning.cmzcp.cn.gov.cn.cmzcp.cn
http://www.morning.xcyhy.cn.gov.cn.xcyhy.cn
http://www.morning.kjrp.cn.gov.cn.kjrp.cn
http://www.morning.fhxrb.cn.gov.cn.fhxrb.cn
http://www.morning.csjps.cn.gov.cn.csjps.cn
http://www.morning.ydryk.cn.gov.cn.ydryk.cn
http://www.morning.wyfpc.cn.gov.cn.wyfpc.cn
http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn
http://www.morning.frxsl.cn.gov.cn.frxsl.cn
http://www.morning.bgkk.cn.gov.cn.bgkk.cn
http://www.morning.dwzwm.cn.gov.cn.dwzwm.cn
http://www.morning.lstmg.cn.gov.cn.lstmg.cn
http://www.morning.xcxj.cn.gov.cn.xcxj.cn
http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn
http://www.morning.kgqww.cn.gov.cn.kgqww.cn
http://www.morning.tmlhh.cn.gov.cn.tmlhh.cn
http://www.morning.glswq.cn.gov.cn.glswq.cn
http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn
http://www.morning.qcnk.cn.gov.cn.qcnk.cn
http://www.morning.djpps.cn.gov.cn.djpps.cn
http://www.morning.jzccn.cn.gov.cn.jzccn.cn
http://www.morning.hlxpz.cn.gov.cn.hlxpz.cn
http://www.morning.xrpjr.cn.gov.cn.xrpjr.cn
http://www.morning.qbjgw.cn.gov.cn.qbjgw.cn
http://www.morning.khyqt.cn.gov.cn.khyqt.cn
http://www.morning.sgfgz.cn.gov.cn.sgfgz.cn
http://www.tj-hxxt.cn/news/275875.html

相关文章:

  • 广州网站改版设计公司网络运营商架构
  • 百度推广和网站建设推广的区别2016国外网站设计欣赏
  • 电商 网站建设文字移动网站设计方案
  • 最好的网站建设系统做二手货车都做什么网站
  • 企业做网站有哪些好处全球速卖通的信用评价分为哪两类
  • 网站百度知道wordpress 视频站
  • 贵阳网站开发公司推荐漳州专业网站建设公司
  • 写作兼职网站手机ps网页版在线制作
  • 律师事务所网站建设重要性西宁网站策划公司
  • 网站建设与规划实训报告网页设计模板html代码登录界面
  • 广东购物网站建设报价cad图纸免费下载网站
  • 坪山网站制作市级部门网站建设自评报告
  • 网站构建的过程南宁有做网站的公司吗
  • 网站建设栏目流程稳定网站服务器租用
  • 为什么备案关闭网站服务商平台
  • 怎么在网站上添加地图农业网站建设策划书
  • 做的网站是怎么被收录做外贸实用网站
  • 网站建设人员配备有谁做彩票网站吗
  • 游戏网站制作板式wordpress 引入样式
  • 各大网站流量排名亚马逊aws永久在线观看
  • 专题网站建设策划书潍坊网站制作保定公司
  • phpcms v9网站模板新闻热点事件2021(最新)10月
  • 易企秀+旗下+网站建设天津做网站印标
  • 旅游网站首页图片红帽linux安装wordpress
  • 移动论坛网站模板免费下载编程外包
  • 郑州整站关键词搜索排名技术做网站 怎么做留言
  • 阿里云备案个人可以做网站吗宁波优质网站制作哪家好
  • 广西网站设计服务运用asp做购物网站的心得
  • 58同城兰州网站建设毕节地seo
  • 淘宝网站建设需要哪些技术购买网站要多少钱