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

干货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  一个,然后在底下写方法即可

中国人寿寿险2022年报保费收入超6151亿元行业增长空间正在打开来源人民网原创稿人民网北京3月30日电(记者杜燕飞)当前寿险业结构性增长到了加速期,随着人口老龄化战略健康中国战略实施,新动能加快形成,行业的结构性和长期性增长空间正在打开。中国人海南旅游总收入预计达530亿元来源人民网人民日报本报海口3月29日电(记者韩春瑶张伟昊曹文轩)记者从29日召开的海南全面深化改革开放五年来进展成效新闻发布会上获悉作为海南自由贸易港建设的四大主导产业之一,海南省贝泰妮去年线上收入占比超八成,连续两年发布ESG报告新京报贝壳财经讯(记者于梦儿)3月29日晚,云南贝泰妮生物科技集团有限公司(以下简称贝泰妮)发布2022年业绩报告。期内,贝泰妮实现营业收入50。14亿元,同比上升约24。65净利(财经行情)国际油价29日下跌新华社纽约3月29日电(记者刘亚南)国际油价29日下跌。截至当天收盘,纽约商品交易所5月交货的轻质原油期货价格下跌0。23美元,收于每桶72。97美元,跌幅为0。315月份交货的伦(财经行情)芝加哥农产品期价29日上涨新华社芝加哥3月29日电(记者徐静)芝加哥期货交易所玉米小麦和大豆期价29日全线上涨。当天,芝加哥期货交易所玉米市场交投最活跃的5月合约收于每蒲式耳6。505美元,比前一交易日上涨(体育)乒乓球世乒赛选拔赛(第二站)陈幸同获得女单直通名额当日,在北京举行的中国乒乓球队直通德班世乒赛选拔赛(第二站)女子单打决赛中,陈幸同以4比3战胜王艺迪,获得本站女单冠军及德班世乒赛单打参赛名额。3月30日,女单冠军陈幸同(中)亚军朱婷硬实力,再次征服欧洲,婷女王名不虚传朱婷因手腕受伤,在东京奥运会上表现不佳。奥运会后,朱婷进行了手腕治疗手术,手腕接近完全康复。意大利女排超级联赛俱乐部斯坎迪奇,选择了与朱婷签约一个赛季。朱婷继土耳其瓦基弗银行队之后仙人指路四回合弃马亚补赛魔童独领风骚3月30日,第19届亚洲运动会中国国家象棋集训队补选赛,在中国棋院杭州分院(智力大厦)继续鏖兵,魔童孟繁睿开启接连获胜,独领风骚。男子组大锤申鹏依然霸气领先,女子组吴可欣占上风。比戴维斯3810詹姆斯25分湖人复仇轻取公牛!NBA常规赛3月30日继续进行,最终,湖人以121110战胜公牛。凭借本场胜利,湖人以38胜38负升至西部第八。首节开始,湖人上来全队皆有得分轰出2710的开局!武切维奇三分科比怀中国足球在经过十年失败的尝试后,现在终于彻底结束了!只要看一眼不到十年前的新闻报道,就会记得中国是多么迅速多么深入地把这项世界上最受欢迎的运动作为一项国家项目来接受。当时,中国足球的成功似乎只是决心和金钱的问题。学校被要求将足球纳入爱吃醋的人比不爱吃醋的更健康?秘密全在这儿你喜欢吃醋吗?酸酸的醋,受很多人的深爱。有人吃饭顿顿不离醋,甚至可以直接喝。关于醋还有许多传闻能防癌能消毒能软化血管醋真的有这么多优点吗?一起来看看为什么人们喜爱醋?食醋深受人们的
建议男人们宁可少吃肉食,也不要错过,吃4种含高硒的食物硒是人体内必不可缺少的微量元素之一。定量补硒或者吃一些有关硒的食物的,会给大脑补充充足的氧,在工作中不会产生疲劳感和犯困且能够有效地提高人体免疫力。男性补硒一般具有增强抵抗力提高精长期服用苯磺酸氨氯地平,有哪些副作用?我们应提前知晓高血压已经成为中老年人的常见病,在选择降压药的时候,苯磺酸氨氯地平以其降压效果好应用范围广而受到患者的青睐。但随着服用本药物的人群越来越多,关于苯磺酸氨氯地平,也出现了一些不同的声豆制品是痛风的祸根吗?导语王大爷是一名退休员工,在退休之后加入了养生的行列,由于自己接受了很多知识,所以认为养生可以让自己的身体更健康,但是在前一段时间之后,他在公园中晨练,突然感觉膝盖部位像针扎一样疼人到中年再想喝酒,这3点一定要遵守!讲究点没坏处,建议收藏导语人到中年再想喝酒,这3点一定要遵守!讲究点没坏处,建议收藏人一旦上了点年纪之后,渐渐地就会开始有一种力不从心的感觉,因此很多人都开始注重起养生,每天过了十点准时上床睡觉,保温杯什么情况?外资突然疯狂杀入A股军工!300亿巨头火了被增仓幅度逾60!却净卖出A股超60亿受外围市场剧烈震荡影响,避险情绪再度升温,北上资金本周净卖出60。88亿元。其中,沪股通净卖出27。77亿元,深股通净卖出33。11亿元。欧洲能源危机的持续,致使采掘行业受到追捧,芯片技术获突破?中企强势应对美技术压制本文原创,禁止抄袭,违者必究近日,著名的中国EDA领域主流企业华大九天宣布了一个新消息,声称公司模拟全流程系统当下已经可以完整支持28nm及以上的成熟工艺,并且公司正在大规模推广应为什么风靡一时的智能电视跌落神坛?不解决这些,终难破局十年家电老司机,买家电不迷路!欢迎大家点赞关注!电视机,相信大家都不陌生,它跟冰箱洗衣机空调等都是每个家庭必备的大家电之一。冰箱洗衣机空调属于单一功能性家电,要么洗衣要么制冷要么保取代奔腾和赛扬英特尔推出全新品牌英特尔处理器9月16日,英特尔推出全新英特尔处理器品牌,取代奔腾和赛扬,作为多个处理器产品家族的品牌名称。英特尔公司副总裁兼移动客户端平台事业部代总经理JoshNewman表示英特尔入门级处理三大品牌手机集中发布新品这些功能成为热点荣耀继华为苹果之后也发布了自己的新品,今年的9月份可谓精彩纷呈。华为苹果君把搭载卫星通信作为新机的新功能,OPPO发布自研系统,荣耀发力生态能力,一时间销烟弥漫。如今的手机市场大盘每日一味抗癌中药喜树,清热解毒消肿散结,配伍应用疗效佳喜树珙桐科旱莲属植物喜树,根果及树皮树枝叶均入药。分布于江苏浙江江西福建台湾湖北湖南广东广西等地。秋冬采果,晒干根树皮树枝四季可采,洗净晒干叶春至秋季均可采,鲜用或晒干。别名旱莲,得乳腺癌吃什么食物好?乳腺癌是世界上最常见的女性恶性肿瘤,我国每年约有13500新发乳腺癌病例。生活水平了提高,女性乳腺癌患者的发病率却越来越高,乳腺癌的发病与人们的日常饮食有着密切的关系。除了科学及时