应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

干货swift实现todo状态切换

  置顶
  菜鸟入门,各位大佬轻喷,如有谬误之处欢迎讨论建议,也欢迎各位道友与我同行
  不积跬步,无以至千里;不积小流,无以成江海
  继续
  上文中已经实现了TODO页面的基本新增逻辑以及删除功能
  本文将实现数据每一个TODO项的完成状态切换、创建时间
  以及滑动删除功能。
  同时完成一个数据的抽象,即将数据处理的部分抽象到一个对象内,页面中只管调用即可。
  最终效果如下:
  思考
  还是老规矩,既然要抽象一个数据模型出来,那就是一个独立的文件。
  一个关于TODO的数据模型。
  至少有两个struct,一个todoItem的定义,另一个是todoList的定义
  这个数据模型中是所有的关于这个todolists的操作
  如果所有的操作都集中在这个模型中,那我我们的todo页面中的所有操作即可调用这个数据模型。实现
  我们新增一个TodoModel。swift,内容如下:importSwiftUI;这里是定义todo项的数据结构,结构体用于定义结构,类用于定义完整数据对象structTodoItem:Identifiable,Equatable{给生成一个唯一的id作为标识,相当于实现了IdentifiableletidUUID();todo项名称varname:String;是否已经完成,默认为falsevarisFinished:Boolfalse;创建时间varcreateTime:Int0;完成时间varfinishTime:Int0;用来展示的时间,这里相当于是个computedvarcreatedAt:String{将时间戳转为时间字符串if(createTime0){return;}letdate:DateDate。init(timeIntervalSince1970:Double(createTime))letformatterDateFormatter。init()formatter。dateFormatyyyyMMddHH:mm:ssreturnformatter。string(from:dateasDate)}}ObservableObject代表这是一个可以被观察的对象classTodoLists:ObservableObject{Published代表这个变量的任何变化都会被发布到外面使用这个变量的地方,更新视图private(set)代表这个变量的设置、修改等对外隐藏,但是对外可见〔TodoItem〕代表这是一个数组,里面的每一条数据都是TodoItem类型的Publishedprivate(set)vartodoList:〔TodoItem〕;init(todoList:〔TodoItem〕){self。todoListtodoList如果是个空数组,那么先放一个进去if(todoList。count0){add(name:请添加TODO)}}添加一条todo项,只要名称即可funcadd(name:String){if(name){return;}varitemTodoItem(name:name);item。createTimeInt(Date()。timeIntervalSince1970);self。todoList。insert(item,at:0);}切换todo项的是否完成状态,如果完成状态为true那更新finishTimefunctoggle(item:TodoItem){找到这一条的索引index,0代表这个方法的第一个参数letindextodoList。firstIndex(where:{0。iditem。id})ifindex!nil{index!代表我知道这个index一定存在,不用再进行判断了todoList〔index!〕。isFinished。toggle()如果是完成,那么更新已完成时间,否则改为0if(todoList〔index!〕。isFinishedtrue){todoList〔index!〕。finishTimeInt(Date()。timeIntervalSince1970);}else{todoList〔index!〕。finishTime0;}}}删除todofuncdelete(offsets:IndexSet){offsets。forEach{indexintodoList。remove(at:index)}}}
  既然我们数据模型已经定义好了,那么自然要修改TodoView。swift页面中的使用
  修改如下:
  TodoView。swiftimportSwiftUIstructTodoView:View{是否已经登陆AppStorage(isLogin)privatevarisLogin:Boolfalse;已经登陆的用户名AppStorage(userName)privatevaruserName:String;输入框输入的新的TODOStateprivatevarnewItem:String;使用我们新的数据模型StateObjectprivatevartodosTodoLists(todoList:〔〕);varbody:someView{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,可以预见,之后我们自己构造数据类型的时候也需要一个IdentifierForEach(todos。todoList){iteminHStack{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{IndexSetintodos。delete(offsets:IndexSet)}}。animation(。default,value:todos。todoList)}}}structTodoViewPreviews:PreviewProvider{staticvarpreviews:someView{TodoView()}}总结1。ObservableObject与Published是在主动定义一个可观察的对象,虽然可以添加许多操作,但是感觉上反而不如reactive方法更简洁2。目前看来,Struct一般用来定义结构或者视图,Class才是我们普遍意义上的类。3。数据抽象虽然简化了View,但是感觉比较繁琐,或许我应该考虑直接都放到StructView里面去,参考Vue的结构进行编排,各有优劣,后头试试4。横滑删除的功能非常好实现,直接在Foreach后加上。onDelete即可5。SwiftUI中有很多这种加方法调用即可实现视图以及功能的方法,也许可以参考到Vue或者其他的前端封装里面6。想实现一个computed变量,直接var一个,然后在底下写方法即可

早起好处有多少?早6点起床与早8点起床有什么区别?给你答案常言道:早睡早起身体好,很多人都觉得早起要比赖床更加的养生,但是却并不知道早上几点起床更加的健康。现在的年轻人是不知不觉熬夜到了凌晨,早上赖床已经是家常便饭,如果是放假或……连平去美元化能为人民币国际化打开空间吗连平植信投资首席经济学家兼研究院院长编者按:长期以来,美国经常利用美元在国际货币体系中的霸权地位,转嫁国内危机,收割世界财富,损害他国经济金融稳定和民众福祉。美元霸权已成……为何越发达的国家,越不扶持电商?看到路边的街道就清楚了每个时代在发展过程中,都有新生事物的出现,对于现代社会来说,互联网的诞生与普及无疑是顺应时代潮流。虽然说互联网是一把双刃剑,但是不管是从国家层面看,还是从个人出发,互联网优点远……朱芳雨再获驰援!广东队昔日死敌来投,联手威姆斯冲击CBA总冠广东宏远揭幕战大胜深圳男篮,拿到新赛季CBA开门红。易建联在时隔一个多赛季之后重返赛场,整体表现十分高效,7分钟拿到16分2篮板,徐杰也是贡献18分3篮板6助攻,除此之外,赵睿……永劫无间劫杯万仞轮成降智轮?虎牙KN战队浪过头,错失吃鸡12月4日,迎来了永劫无间劫杯预选赛入围赛第三次的比赛,在第三场比赛中虎牙KN战队上演了一幕让人哭笑不得的画面。在本来大优势情况下,稳稳吃鸡的时候,由于过于执着万仞轮这个装备,……陕西秦岭行(4)陕西秦岭行(4)沿张茶路穿越秦岭2022年8月8日。中午,我们游定军山毕,便沿张茶路穿越秦岭,前往留坝县。张茶路是勉县茶店镇至留坝县张庙村的县乡级公路,全程约……今夏流行瘦瘦裤,120斤穿成90斤在大多数人的观念里,总有美不美,先看腿的说法,拥有一双笔直纤长的腿型,不自觉就会被人打上身材好的标签。特别是闷热的夏天,谁不想换上短裤短裙,彻底告别又闷又热的束缚感,解放……98英寸电视您尽管放心购买!剩下的就交给99入户率的TCL售好产品不仅是体现在基本功能上,还要有对用户的人文关爱。就拿近期众多消费者都在热议的98英寸电视入户问题,各品牌的售后安装服务就体验了其对用户的态度。据了解,近段时间国内9……提前布局汽车业务带动产品结构改善,立讯精密预计2022年净利2023年1月4日开盘后,消费电子龙头立讯精密(002475。SZ)早盘低开跳水,午后触及跌停。据悉,近期有媒体报道称,苹果以需求减弱为由,通知中国大陆供应商本季减产AirPo……2022跨年海报文案,发圈必备!你的2022年正在派件,请保这一年里,你过得怎么样呢不管2021年多么艰难,都快过去了,让我们一起迎接美好的2022,新年一定会越来越好的。今年小码给大家提前准备好了跨年海报和文案!跨年20211、……官方世界杯亚军法国队将在巴黎举行游行集会,明晨3点30分开始直播吧12月19日讯法国足协官方宣布,夺得世界杯亚军的法国队今晚将在巴黎举行游行集会活动。这一说法与此前法国足协主席的发言正好相反。根据最新消息,法国足协在一份通讯……各大卫视2023跨年晚会,女明星争芳斗艳,谁最性感?各大卫视的2023跨年晚会圆满落幕,各路女明星争芳斗艳,成为亮点之一。女星们不仅拼实力、拼排场,在造型上更是铆足了劲儿,一定要在2023年第一次亮相扬眉兔气。小编做……
脸垮瘪嘴声音出戏演技油腻,才36岁杨幂就开始走下坡路杨幂的时代过去了?短短一个月,杨幂接连着有两部作品播出,前脚《谢谢你医生》扑得毫无水花,后脚《爱的二八定律》口碑两极,乍一看,流量仿佛不再青睐杨幂了。在11月14日……成分党必知EGF想要有效护肤,当然不可避免地要具有一定的成分观念,不单单看产品的宣传,更要看产品的成分,今天我们来唠一下护肤品成分之EGF。‘EGF’是什么EGF也就是表皮生长因子……华为stag搭配华为watch3pro骑行体验无意中在网上看到华为watch3pro可以申请体验鸿蒙3。0了,具体方式是到我的华为升级尝鲜harmonyos3。0尝鲜华为watch系列中自行申请,大概一到两个工作日就会收到……认知,比勤奋更重要人的一生,就是不断地在对抗自己认知局限的过程。选择比努力更重要,认知比勤奋更重要。认知能力直接影响人的判断和做法;而做法的不同,将直接导致截然不同的人生。01认知比……人生,多一份平和,就多一些温暖,多一份真心,就多一些温馨头条创作挑战赛人活着没有必要凡事都争个明白跟亲人争争来争去亲情就没有了跟爱人争就算你争赢了感情随之也就淡了跟朋友争争……孩子出现双排牙怎么办!比蛀牙更难搞?父母要引起重视首先给大家普及一下什么是双排牙。双排牙是指在乳牙没能及时掉落在恒牙出现之前,出现了乳牙、恒牙共存的现象,两牙并列生长于牙槽嵴上,导致恒牙内陷于牙弓内侧的情况,医学专业术语称之为……华为Mate50RS保时捷概念图有鸿蒙没麒麟,硬刚iPhon华为Mate系列在沉寂了两年之后,终于有了令人振奋的消息曝光。没有了华为旗舰手机,手机市场中安卓手机几乎包揽了中端手机市场,而高端手机市场则是被iPhone牢牢把控,当初……有喜有忧!吉林老将获俱乐部顶薪续约,姜伟泽下赛季将何去何从?随着辽篮在季后赛总决赛的G4比赛中轻松击败浙江广厦,夺得了CBA总冠军,本赛季的CBA联赛也正式画上了一个句号。回顾本赛季的CBA季后赛,大部分比赛的结果都在情理之中。只……云顶之弈7。5赛季即将更新,中秋节活动送头像和表情英雄联盟云顶之弈7。5赛季即将在9月8日更新,除了新加入的种族、礼包和棋子,云顶宝典和新的小小英雄等也同步更新。这次免费宝典会送个温泉蛋小小英雄,还是挺可爱的。另外国服中秋节开……文化和旅游部提醒广大游客做好个人防护平安健康出游国庆假期即将来临,文化和旅游部提醒广大游客,做好个人防护,平安健康出游。一、合理安排行程。通过权威渠道了解出发地及目的地最新疫情防控政策,自觉遵守当地政府及有关部门发布的……网易用7亿立的游戏圈最大Flag完成度如何?会成现象级吗?耗资7个亿、自诩要颠覆MMO生态的《逆水寒》手游,算是立下了游戏圈最大Flag,而其盲盒测试已经进行了5天,那么,这款游戏的完成度究竟如何?能否成为现象级呢?综合这几天看直播和……立秋后,遇到这菜抓紧吃!比韭菜营养,比芹菜鲜美,不懂吃真可惜导语:立秋后,遇到这菜抓紧吃!比韭菜营养,比芹菜鲜美,2块钱做一大盘,清香营养又解馋,不懂吃真可惜!立秋后有一种蔬菜正当季,它比韭菜还鲜美,大家好,我是傻姐美食,我们的口……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网