范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

干货swift实现todo状态切换

  置顶
  菜鸟入门,各位大佬轻喷,如有谬误之处欢迎讨论建议,也欢迎各位道友与我同行
  "不积跬步,无以至千里;不积小流,无以成江海"
  继续
  上文中已经实现了  TODO  页面的基本新增逻辑以及删除功能
  本文将实现数据每一个  TODO  项的完成状态切换、创建时间
  以及滑动删除功能。
  同时完成一个数据的抽象,即将数据处理的部分抽象到一个对象内,页面中只管调用即可。
  最终效果如下:
  思考
  还是老规矩,既然要抽象一个数据模型出来,那就是一个独立的文件。
  一个关于  TODO  的数据模型。
  至少有两个  struct  ,一个 todoItem  的定义,另一个是 todoList  的定义
  这个数据模型中是所有的关于这个  todo lists  的操作
  如果所有的操作都集中在这个模型中,那我我们的 todo 页面中的所有操作即可调用这个数据模型。 实现
  我们新增一个  TodoModel.swift ,内容如下: import SwiftUI;  // 这里是定义 todo 项的数据结构,结构体用于定义结构,类用于定义完整数据对象 struct TodoItem:Identifiable,Equatable{     // 给生成一个唯一的id作为标识,相当于实现了 Identifiable     let id = UUID();     // todo项名称     var name:String ;     // 是否已经完成,默认为false     var isFinished:Bool = false;     // 创建时间     var createTime:Int = 0;     // 完成时间     var finishTime:Int = 0;     // 用来展示的时间,这里相当于是个 computed     var createdAt:String {         // 将时间戳转为时间字符串         if(createTime == 0) {             return "";         }         let date:Date = Date.init(timeIntervalSince1970: Double(createTime))         let formatter = DateFormatter.init()         formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"         return formatter.string(from: date as Date)     } }  // ObservableObject 代表这是一个可以被观察的对象 class TodoLists : ObservableObject {     // @Published 代表这个变量的任何变化都会被发布到外面使用这个变量的地方,更新视图     // private(set) 代表这个变量的设置、修改等对外隐藏,但是对外可见     // [TodoItem] 代表这是一个数组,里面的每一条数据都是 TodoItem 类型的     @Published private(set) var todoList:[TodoItem];          init(todoList: [TodoItem]) {         self.todoList = todoList         // 如果是个空数组,那么先放一个进去         if(todoList.count == 0 ){             add(name: "请添加TODO")         }     }          // 添加一条 todo项,只要名称即可     func add(name:String){         if(name == ""){             return ;         }         var item = TodoItem(name: name);         item.createTime = Int(Date().timeIntervalSince1970);         self.todoList.insert(item,at: 0);     }          // 切换todo项的是否完成状态,如果完成状态为true那更新finishTime     func toggle(item:TodoItem){         // 找到这一条的索引 index,$0代表这个方法的第一个参数         let index = todoList.firstIndex(where: {$0.id == item.id})         if index != nil {             // index! 代表我知道这个index一定存在,不用再进行判断了             todoList[index!].isFinished.toggle()             // 如果是完成,那么更新已完成时间,否则改为0             if(todoList[index!].isFinished == true){                 todoList[index!].finishTime = Int(Date().timeIntervalSince1970);             }else{                 todoList[index!].finishTime = 0;             }         }     }          // 删除todo     func delete(offsets: IndexSet){         offsets.forEach { index in             todoList.remove(at: index)         }     } }
  既然我们数据模型已经定义好了,那么自然要修改  TodoView.swift 页面中的使用
  修改如下:
  TodoView.swift  import SwiftUI  struct TodoView: View {     // 是否已经登陆     @AppStorage("isLogin") private var isLogin:Bool = false;     // 已经登陆的用户名     @AppStorage("userName") private var userName:String = "";     // 输入框输入的新的TODO     @State private var newItem:String = "";     // 使用我们新的数据模型     @StateObject private var todos = TodoLists(todoList: []);          var body: some View {         VStack{             HStack{                 TextField("请输入新的TODO",text:$newItem).onSubmit {                     todos.add(name: newItem)                     newItem = ""                 }                 Button("确认"){                     todos.add(name: newItem)                     newItem = ""                 }             }.padding()             List{                 // Foreach 开始循环 TodoLists 的indices,需要它的索引值,用于删除等                 // id 需要为一个 Identifier,可以预见,之后我们自己构造数据类型的时候也需要一个 Identifier                 ForEach(todos.todoList){ item in                     HStack{                         VStack{                             HStack{                                 // 字符串拼接,之前已有使用                                 Text("(item.name)")                                 Spacer()                             }                             HStack{                                 Text("(item.createdAt)").font(.subheadline)                                 Spacer()                             }                         }.foregroundColor(item.isFinished ? .gray : .primary)                         // 这里用个Group套起来,里面用三元实现点击切换图标,展示是否已经完成                         Group{                             item.isFinished ?                             Image(systemName: "circle.fill") :                             Image(systemName: "circle")                         }                     }.contentShape(Rectangle())                     .onTapGesture {                         todos.toggle(item: item)                     }                 // 这个调用将实现横滑删除功能                 }.onDelete{ IndexSet in                     todos.delete(offsets: IndexSet)                 }             }.animation(.default,value:todos.todoList)         }     } }  struct TodoView_Previews: PreviewProvider {     static var previews: some View {         TodoView()     } }总结1.  ObservableObject  与 @Published  是在主动定义一个可观察的对象,虽然可以添加许多操作,但是感觉上反而不如 reactive  方法更简洁2. 目前看来, Struct  一般用来定义结构或者视图,Class  才是我们普遍意义上的类。3. 数据抽象虽然简化了View,但是感觉比较繁琐,或许我应该考虑直接都放到  Struct View 里面去,参考 Vue  的结构进行编排,各有优劣,后头试试4. 横滑删除的功能非常好实现,直接在  Foreach 后加上 .onDelete  即可5.  SwiftUI  中有很多这种加方法调用即可实现视图以及功能的方法,也许可以参考到 Vue  或者其他的前端封装里面6. 想实现一个  computed 变量,直接 var  一个,然后在底下写方法即可

作为地球的卫星,月球疑点重重,月球的存在真的合理吗?空心的月球大家在网上有没有看到类似这样的图片呢?月球的内部是空心的,里面像是一座巨大的城市。更有人甚至怀疑月球是宇宙超级文明制造的,并把它放在地球附近用来监视地球。诸如此类的关于月特斯拉2023年投资者日总结让地球拥有可持续能源的未来ThepathtoafullysustainableenergyfutureforEarth。通往地球完全可持续能源的未来之路。埃隆马斯克全文约3000字,阅读可能需要5分钟。特斯琉球现状如何?我们是否还拥有主权要求?如今还能收回来么?日本必须要还琉球人民自由,任何理由和借口都不行,二战结束已经长达77年,中古故土琉球群岛,被美国赠与日本也过了整整50年,期间琉球被美日两国反复利用,没人在乎琉球人民的生死,那么琉故宫六百年504讲建文下落建文四年(1402)六月,朱棣率军打进南京皇宫后,建文帝朱允炫活不见人死不见尸,下落如何?这就成为明宫六百年来,一桩历史疑案。这要从一个神秘的盒子说起。神秘盒子朱棣进4G网变卡的原因找到了!专家一语道破关键,这2个原因要引起重视还在使用4G手机的朋友,你们有没有发现,4G网变卡了?近日,寻找小莉帮忙的农民朋友,也遇到了同样的问题。使用4G网直播带货的时候,经常会因为网络卡而失去顾客,从而影响了最终的带货效为什么民间说常灸足三里,胜吃老母鸡?中医专家给你科普我国民间有常灸足三里,胜吃老母鸡一说,为什么民间说艾灸足三里与吃老母鸡有同等功效呢?中医学认为,鸡肉能补肾益精补益脾胃补血养阴,可用于食欲不振面色萎黄或产后体虚头晕少乳及闭经月经量华彬快消品参展2023FHE战马获创新健康科技产品奖近日,博鳌健康食品科学大会暨博览会(FHE)在博鳌亚洲论坛国际会议中心举办,本次大会旨在通过国内外科学信息的交流,推动健康食品产业的发展,搭建一个政府学术界产业界,以及产学研交流合产品上做减法,长城汽车能否完成160万辆销量目标?特斯拉在今年开年打响了降价第一枪,随后问界小鹏等多家车企跟随降价,即便是2022年销量第一的比亚迪近日也将新推出的DMi车型起售价格首次下探至10万元以内。某种程度上,特斯拉降价打仅需500万欧!米兰夏窗锁定世界冠军中卫,天价高薪难住马尔蒂尼据西班牙媒体体育世界报道,意甲豪门AC米兰正在关注法国中后卫乌姆蒂蒂,在来到意甲之后,乌姆蒂蒂表现得十分出色,不仅稳坐主力位置,还帮助升班马莱切稳居积分榜中游,这样的表现也被米兰看曾仕强为什么你总是看不惯别人的所作所为?我们所过的每一天,都可能是人生最后一天,很多事情是来不及补救的,所以要提前留下可以补过的时间。曾仕强不论是在生活中还是职场上,如果你总看不惯别人的所作所为。可能是由下面两方面造成的不要因为善良,给别人撑伞,淋湿了自己诗人顾城曾在玫瑰中写玫瑰佩戴着锐刺,并没有因此变为荆棘,它只是保卫自己的春华,不被野兽们蹂躏。做人就应该当如玫瑰一般,它的刺只是为了保护自己不被野兽践踏蹂躏,但丝毫不影响它的美丽和
第二个郑州现身?富士康华为争相进驻,斥资30亿开办产业文历了个史编辑历了个史曾经的富士康红火无比,许多人挤破头都想进厂打工,同样都是工厂,为啥富士康那么招人稀罕?富士康在郑州站稳脚跟,为数以万计的年轻人带来了就业机会,还带动周边地区以春天来了,万物复苏,适合自驾游的季节到了春回大地万物复苏!北京市推出121家公园赏花片区,带来浪漫的气息。北京市推出121家公园赏花片区,北京市各区均有分布,总观赏面积超过680万平方米,而60项精彩纷呈的春季公园文化活出发!贵阳直飞泰国普吉航班今日复航随着出境旅游有序恢复并迅速回暖,今天(3月14日)12点35分,搭载着186名乘客的AQ1201航班从贵阳龙洞堡国际机场启航,这是贵州三年来第一架直飞普吉的国际客运航班,为贵阳市出小红书私删用户手机照片?官方紧急回应手机安装App时总会要求用户授权各种各样的权限授权的权限被合理规范使用倒还好假如App利用权限私自操作大家手机里的隐私数据是不是想想就后怕?近日有网友反馈手机系统提示小红书试图删除关于newbing,你想问的是?本期问题1。未来自动化会取代人工吗?未来自动化会取代人工吗?2。对于光伏能源的看法。对于光伏能源的看法。3。未来,对于能效转换和储能设备,谁才是真正需要攻克的难点?未来,对于能效转软联科技智能会议预约系统开启高效办公新体验随着人工智能时代的到来,全球信息技术不断更新迭代,数字化架构正重塑企业发展新格局。在此背景下,各企业对于会议的效率要求与质量要求也愈来愈高,技术的不断融入与升级或将对会议室形态重新被骂上热搜!全球第一的手机,今天彻底翻车如果小雷说,有一个手机厂商上了微博热搜,大伙估计不会感到意外。毕竟现在的手机厂商都比较出名,国内的华米OV只要发布旗舰新机,那几天的机圈必然是腥风血雨,各家粉丝吵得不可开交。换个角4万字告诉你ChatGPT可能引发的风险中美在AI领域的竞争与差距文钱鸿生编辑唐晓园序言及摘要作为星船知造现代通信与智能网技术展望系列栏目的第一辑,我们邀请星船知造的资深读者通信行业教授级高级工程师钱鸿生博士为我们撰写了ChatGPT技术架构及中不装了?中企的真面目被揭开,美媒第二个华为不好惹大家都知道,美国之所以断供华为芯片,就是为了让苹果成为中国高端市场的王者,从而肆无忌惮的收割财富。但是剧本并没有按照老美的意思发展,反而激发了中企的斗志,为了不重蹈覆辙,以小米为首骁龙870面临落幕,这4款手机都是高配低价,入手很划算骁龙870处理器有出色的口碑,不仅性能强大,功耗表现也很不错,上市两年都还有相应的机型,不过随着骁龙8Gen2旗舰处理器的发布,骁龙870也将要落幕了。下面给大家分享4款搭载骁龙8先别着急下单,看清楚用户口碑再决定要不要入手一加Ace2V对于一款手机来说,用户口碑的好坏显得极为重要。其中最重要的一个原因就是网上购机的人太多了,特别是对于年轻人来讲,选购新手机之前必定是要看各种测评文章,还有各大电商平台的用户口碑。但