让不懂编程的人爱上iPhone开发系列2 iOS12+Swift4.2版-Checklists-16

添加导航栏按钮

说明:

本系列教程改编自raywenderlich.com中的iOS Apprentice系列,有需要的童鞋请移步到这里购买英文版原教程:https://store.raywenderlich.com/products/ios-apprentice

欢迎继续我们的学习。

在上一课的内容中我们成功添加了导航栏,接下来我们需要添加一个导航栏按钮,以便让用户轻松添加自己的待办事项。

首先打开storyboard文件。

接下来在Object Library中找到Bar Button Item,然后把它拖曳到导航栏的右侧位置。注意是

Checklists View Controller⾥⾯的导航栏,⽽不是导航控制器里面的

默认情况下这个新的按钮名为”Item”,不过我们这⾥需要把它改成⼀个”+”号标志。

选中这个bar button item,然后在右侧的Attributes inspector中选择System Item: Add

仔细看看Identifier 列表⾥⾯的其它选项,你可以看到很多预定义的bar button 类型: Add,Compose,Reply,Camera等等。根据⾃己应用的需要,你可以选择合适的类型,选错了的话苹果可是会拒绝你的应用上线哦~

好了,现在我们已经成功的添加了⼀个按钮。编译运行应⽤,结果是这样的:

如果你已经迫不及待的按“+”按钮,会发现没有什么反应,这是因为我们并没有给触碰事件关联⼀个 action动作⽅法。稍后我们会创建⼀个Add Item界⾯,然后当触碰按钮的时候显⽰新的界⾯。不过 在此之前我们先学习如何在表中添加新的行。

⾸先把这个添加按钮和某个动作⽅法关联起来。

让导航栏按钮正常工作

接下来让我们把Add按钮和实际的动作关联起来。在上一系列的课程中,我们应该已经非常熟悉这些操作了。

首先在ChecklistViewController.swift中添加一个新的action方法:

     //MARK: - Actions@IBAction func addItem(){}

当然,现在这个方法还是空的,稍后我们会往里面填充内容。

注意:

在这个方法的前面我加了一个注释行,通常我会把所有的动作方法都放在一起,方便管理。当然,你也可以有自己的习惯,但是让代码具有可读性是一个良好的编码习惯。

接下来打开storyboard,把Add按钮和这个动作方法关联起来。

为此,只需要按下Control键,然后从+按钮拖一条线到代表Checklist View Controller的小圆圈就好了。

然后从弹出的框中选择Sent Actions下面的addItem。

好了,动作方法的关联已经完成了。

接下来我们要让addItem()方法实际完成某些任务。

返回ChecklistViewController.swift,然后更改addItem方法吐下:

    @IBAction func addItem(){let newRowIndex = items.countlet item = ChecklistItem()item.text = "我是新添加的一行内容"items.append(item)let indexPath = IndexPath(row: newR
owIndex, section: 0)let indexPaths = [indexPath]tableView.insertRows(at: indexPaths , with: .automatic)}

这个方法的作用简单来说就是创建了一个新的ChecklistItem对象,然后把它添加到数据模型之中(items数组)。然后我们还需要通知表视图,“我已经在这个index序号的位置插入了新的一行数据,麻烦更新下自己把它显示出来。”

接下来我们一行行的解释刚才所新添加的代码。

let newRowIndex = items.count

首先我们得知道新的一行数据在数组中所在的位置。

当我们启动应⽤的时候,在数组中已经有了6个项目,在界⾯上已经出现了6⾏数据。计算机从0开始 计数,因此现有的⾏编号就是0,1,2,3,4和5。我们需要在数组的结尾添加新的⾏,所以新⾏的 编号就是6。

换句话说,当我们在表中添加⼀⾏新数据的时候,新⾏的编号始终等于表中当前的项目数。这⾥的 newRowIndex就是新⾏的编号。

接下来的⼏几⾏代码⼤大家就相当熟悉了。

  let item = ChecklistItem()item.text = "我是新添加的一行内容"items.append(item)

这⼏几⾏代码之前在viewDidLoad⽅法中看到过。我们创建了⼀个新的ChecklistItem对象,然后把它 添加到数组的最后。现在数据模型的_items数组⾥⾯就有了6个ChecklistItem对象。

注意现在newRowIndex是5,⽽[items count]已经变成了6。这就是为什么我们需要读取[items count],,然后把它保存在newRowIndex这个本地变量中。

接下来的代码看起来就有点恼火了。

 let indexPath = IndexPath(row: newRowIndex, section: 0)

仅仅把新的ChecklistItem对象放到数据模型中还不够。我们还得告诉表视图有了⼀个新的行,这样 它才会分配⼀个新的cell给这⼀行。之前我们学过,表视图通过index-paths来识别行,所以⾸先需 要创建⼀个IndexPath对象指向新的⾏,⽽使⽤的参数则是newRowIndex这个⾏编号。这样⼀ 来,index-path对象就可以指向section 0的第5⾏了。

下一行代码创建了⼀个新的临时性的数组:

let indexPaths = [indexPath]

由于接下来我们将使用表视图的insertRows(at:with:) ⽅法来插⼊新的行,不过看名字你也知 道,我们会同时插入多个⾏。因此我们需要⼀个index-paths的数组,而不是⼀个单⼀的 IndexPath对象。好吧,这样做不是很⽅便,但只能这样。幸运的是,现在我们可以使⽤[indexPath]这种方式来创建⼀个包含单⼀index-path对象的数组。[]⽤于创建⼀个包含在方括号中所有对象的Array数组对象。

最后,我们通知表视图调用insertRowsAtIndexPaths方法来插入新的行,还带有⼀个动画效果:

tableView.insertRows(at: indexPaths , with: .automatic)

好了,重复⼀遍以上步骤:

  1. 创建

⼀个新的ChecklistItem对象

2. 把它添加到当前的数据模型中

3. 在表视图中为该⾏数据插⼊⼀个新的cell

编译运行应⽤,现在我们可以随意添加新的行了。你还可以触碰这些新行来添加或去掉勾选标志。 你可以随意上下滑动表,这些勾选标志的状态会被正确的保持。

特别需要强调的⼀点是,当你需要显⽰新的⾏时,需要往表和数据模型中同时添加新的行数据。当 你向表视图发送insertRows(at:with:)

消息时,其实就是说:”那啥你好,我的数据模型⾥⾯有了不 少新东⻄西,⿇烦你显示一下。“这太重要了,如果你忘了通知表视图,或者你通知了表视图但却忘了给数据模型里面添加新数据。那么应⽤就会崩溃。这⼆者必须同步进⾏。

⼩练习:

让这些新添加的代办事务默认情况下被勾选。

One more thing…

删除行

在结束今天的学习之前,我们还要再实现⼀个新操作,就差不多圆满了。

那就是—- 删除行数据

既然你允许⽤户添加新的⾏,显然也要允许他们删除旧的行。在iOS应⽤中,最常⽤的方式就是 swipe-to-delete,滑动删除。简单来说,你在某一行上滑动⼿手指,然后就会看到屏幕上出现⼀个红⾊的Delete按钮。如果你触碰这个Delete按钮,就确认删除,如果触碰了屏幕的其它地⽅就是取消该操作。

看起来很⾼大上,其实确实很高大上,但是实现起来倒是超级简单。

回到ChecklistViewController.swift,然后在其它表视图的代理方法前后添加下面这个新方法:

 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {//1items.remove(at: indexPath.row)//2let indexPaths = [indexPath]tableView.deleteRows(at: indexPaths, with: .automatic)}

当我们在视图控制器(表视图的数据源)中提供commitEditingStyle方法时,表视图就会⾃动启⽤ swipe-to-delete的功能。我们要做的就是:

1.从数据模型中删除该项目。

items.remove(at: indexPath.row)

2.从表视图中删除对应的行

let indexPaths = [indexPath]
tableView.deleteRows(at: indexPaths, with: .automatic)

以上代码看起来复杂,其实和之前在addItem⽅法中所做的类似。这⾥我们再次创建了⼀个只有⼀个index-path对象的Array对象,然后通知表视图以动画的形式删除了这些行(实际上是这一行。

One last thing…

结束之前,再来点理论脑补。

销毁对象

为了让⾃己晚上不做噩梦,有时候我们希望可以清除⾃己的⼀些回忆,可惜目前还很难做到,至少不能精准的定点清除。
不过对于不想要的对象,我们就可以毫不客⽓了。

当调⽤ items.remove(at:)⽅法时,不仅从数组中删除了这个ChecklistItem对象,实际上也永久将其销毁了。

关于对象的销毁,后⾯的教程中还会提到,这⾥⼤大概说⼀下。当程序中没有对某个对象的引⽤时,它就会被自动销毁。只要某个ChecklistItem对象还在数组中,那么数组就保持着⼀个到该对象的引 ⽤。但是当我们把这个ChecklistItem对象从该数组中拖出来后,引⽤没了,对象也会被销毁,或者 ⽤术语党的话叫deallocated(释放)。

那么⼀个对象被销毁意味着什么? 每个对象都占⽤着计算机(或者iPhone)上的⼀⼩部分内存。当我们创建⼀个对象的时候,就会保留一小块的内存⽤来保存对象的值。当该对象被 删除(释放)的时候,这部分内容就会再度开放,最终可能被其它新的对象所使⽤。当某个对 象被销毁之后,该对象就不存在了,你再也没机会⽤到它。

很抽象?

⼀个对象就是程序世界的⼀个⽣命,就好⽐芸芸众⽣的我们。当⼀个新⽣命诞⽣的时候, 需要⼀个由分子原⼦组成的有机体来容纳它,这个有机体的形状、大小会随着⽣命的成长而发⽣变化,但始终为该有机体所⽤。直到有⼀天生命逝去,有机体会分解,重新化归泥⼟和分⼦原⼦,⽇后可能会被任何的其它⽣命或⾮⽣命所使⽤,这就是轮回?

在上古时代的iOS5.0之前,iOS开发者需要⼿动管理内存,此后苹果推出了ARC(⾃动引⽤计数)技术,让iOS 开发的内存管理不再那么晦涩难懂。关于ARC有点不好理解,这⾥就先不占⽤篇幅讲了。

好了,今天的学习到此结束。

.ne中的控制器循环出来的数据如何显示在视图上_让不懂编程的人爱上iPhone开发系列2 iOS12+Swift4.2版-Checklists-16...相关推荐

  1. .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...

    0.前言 在之前的几篇中,我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. ...

  2. .ne中的控制器循环出来的数据如何显示在视图上_Web程序设计-ASP.NET MVC4数据库操作实例...

    ASP.NET MVC4数据库操作实例 之前文章介绍了MVC4与Pure框架结合进行的网页设计过程中如何定义控制器.方法.模型.视图等.并使用实例进行了简单说明.本文将在此基础上进一步说明如何使用MV ...

  3. seaborn使用violinplot函数可视化小提琴图、并在violinplot函数中设置inner参数来添加数据点显示数据的稠密程度

    seaborn使用violinplot函数可视化小提琴图.并在violinplot函数中设置inner参数来添加数据点显示数据的稠密程度(Seaborn violinplot with data po ...

  4. Delphi中多线程用Synchronize实现VCL数据同步显示

    概述: VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现.在类的Ex ...

  5. 关于后端数据无法显示在页面上的问题

    问题出现:数据无法显示在页面上的问题 ,jsp中EL表达式在前端页面里被视为文本内容而显示出来 原因分析:可能是xml配置问题,不支持EL表达式 web.xml内容如下: <!DOCTYPE w ...

  6. 编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上。

    编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上. package p1;import java.io ...

  7. 在ASP.NET中使用ListView控件对数据进行显示、分页和排序

    最终效果图如下所示: 使用ListView控件是不需要写代码的,下面我们来看一下ListView的操作流程: 1.首先新建一个ASP窗体 2.然后拖入一个ListView和一个SqlDataSourc ...

  8. mongodb的数据怎么导入到hdfs上_如何成为一名合格的数据架构师?

    "本文作者:奇点云高级数据架构专家 天启,奇点云高级数据架构专家,原海尔集团数据架构师.原阿里巴巴政务团队数据架构师.精通数据仓库建模理论及数据开发技术,具备零售.政务.医药.制造等多个领域 ...

  9. DataGrid中选择列文本根据绑定数据不同显示为不同颜色的处理办法

    目前在维护一个Web应用,用户提出一些对我来说要求比较高的需求,摸索了一下,终于解决了.和大家分享一下:         问题:一般DataGrid中会有部分选择列,例如:         <a ...

最新文章

  1. 五分钟让你搞懂什么是“构造方法”
  2. 阅读论文《一种金融市场预测的深度学习模型FEPA》(1)
  3. 64 任务调度神器 Airflow
  4. Cesium学习笔记(四)Camera
  5. svnsync实现版本库的同步备份
  6. api接口怎么用_API接口的使用我这里用java和python都写出来了
  7. 应用squid全面加速web(全)
  8. Android 系统(42)---Android7.0 PowerManagerService亮灭屏分析(三)
  9. jar 反编译 java_java打包jar反编译
  10. SpringBoot项目报错:The field content exceeds its maximum permitted size of 1048576 bytes
  11. 机器学习算法工程师面试经历
  12. ios个人小游戏开发者如何做到年收益过百万?
  13. 带你深入剖析TCP/IP协议、TCP协议和UDP协议、IP协议
  14. 2019吉林大学计算机学硕考研,计算机科学与技术学院2019年硕士研究生复试基本要求...
  15. 向量的加减(运算符重载)
  16. Q版京剧脸谱来喽——黑脸
  17. 计算机工作自动化的特点,计算机内部自动化操作等特点.doc
  18. 修改系统时区(基于Debian的系统)--用Enki学Linux系列(15)
  19. Android 获取 签名哈希值 sha1值
  20. 基于随机森林模型的葡萄酒品质分析

热门文章

  1. 高并发分布式系统中生成全局唯一Id汇总
  2. Maven学习总结(24)——Maven版本管理详解
  3. aliyun gradle 代理_android studio gradle国内代理设置
  4. MySQL工作中的实际用_总结工作中经常用到的mysql基础知识
  5. FreeTreeView一个可添加、删除、修改的无限极树形结构
  6. 区块链研习 | 区块链的能力很大又很小
  7. 关于开源产业的5个真相
  8. [Link]选择一个 Python Web 框架:Django vs Flask vs Pyramid
  9. 聪明的ITPRO之二IT人做事要“圆”
  10. 【概率论】对弈输光模型,ruin model