用 Swift 开发一个 TODO 应用
背景
相信不少 iOS 程序员对于 Swift 依旧持以观望的态度,一来是这小家伙刚出来没几天,本身还处于完善的阶段;二来是学习的成本较高,看完官方文档怎么也要个几天的时间;三来是反正最近几年很难在工程项目里推广使用,工作又用不到,那我学个锤子呐。
是的,我一开始也是这么想的。直到有一天,我遇到了它:Swift Tutorial - To Do List App。这是 YouTube 上的一个很好地视屏教程,手把手教你如何完成一个 TODO 的应用,功能很简单,就是添加任务和浏览任务。将视屏内容整理了一下。虽然没有什么高深的内容,但是作为一个入门的小程序还是挺适合的。
适用人群:有一定 Objective-C 的开发基础但是还没怎么接触 Swift 不过装有 Xcode6 想感受一下的 iOS 开发者。
客官,都看到这里了,何不打开 Xcode6 耍两把?玩一玩噻!来吧。来嘛!
需求
我们想做一个很简单的小东西,和官网的 Demo 一样,是一个 TODO 列表 (TODO:待办事项) ,具有以下功能:
- 有一个列表显示 TODO
- 有一个页面添加 TODO
- 点击添加按钮,在列表显示新的 TODO 列表
揍是这么简单,让我们开始吧!
新建项目
新建一个项目,选择 Tabbed Application 模板,项目名称为:MyTodoList。记得选中 Swift 作为开发语言。Xcode 会创建一个 Swift 的项目:
添加管理类
我们需要的第一个类是一个 TodoList 的管理器,用来存储 TODO 列表的数据,进行一些增删改查的基本操作。我们将其命名为 TodoManager
。
在左侧文件夹上右击,选择 New File,选择 Cocoa Class ,类名为 TodoManager
,继承自 NSObject , Xcode 会自动为我们添加一个 TodoManager.swift 文件。
我们在 Swift 里定义的变量和函数都是全局属性的,这样我们可以在类的外面定义一个 TodoManager 的对象todoManager
,简单的实现了单例模式:
import UIKit
var todoManager : TodoManager = TodoManager ()
class TodoManager: NSObject {
}
接下来定义一个结构体 (struct) 来表示一个 TODO 项,它有两个属性,一个是任务名称,一个是任务描述:
struct todo {
var name = "Un-Named"
var desc = "Un-Described"
}
在 TodoManager 里面添加一个 todos 数组,用来存储所有的任务:
class TodoManager: NSObject {
var todos = [todo]()
}
最后定义一个方法 addTask
,用来添加任务:
class TodoManager: NSObject {
var todos = [todo]()
func addTask(name: String, desc: String) {
todos.append(todo(name: name, desc: desc))
}
}
OK,这样 TodoManager
就算基本完成了。
开发界面
回到 StoryBoard ,我们把页面上系统自动生成的内容 (几个Label) 删除:
然后加个 UITableView 到 FirstViewController 上:
选中 Tab Bar ,可以编辑 Tab Bar 的显示名称和图片:
接下来看下 Second View 。把第二个 Tab Bar 的 Title 改成 Add :
这样基本的页面就算是搞定了。
数据显示
First View Controller
在第一个 Tab 下,将鼠标移到 UITableView 上,按住鼠标右键拖动到 View Controller 上,选择 DataSource 和 Delegate :
回到代码里,打开 FirstViewController.swift 文件,添加 UITableViewDelegate
和 UITableViewDataSource
这两个协议。按住 Command 键点击协议名称可以查看协议的声明,从而知道需要实现那些方法。方法名称和 OC 中的完全相同,只需要转换成 Swift的语法即可。完成之后的 FirstViewController
是这个样子:
class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// UITableView DataSource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todoManager.todos.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Default")
cell.textLabel?.text = todoManager.todos[indexPath.row].name
cell.detailTextLabel?.text = todoManager.todos[indexPath.row].desc
return cell
}
}
Second View Controller
拖拽一些控件搭建下基本的框架,一个 Label 作为标题,两个 TextField 分别填写 TODO 的名称和描述,然后再加上添加按钮,基本的框架时候是这个样子的:
然后我们把这两个 TextField 的 Delegate 都指向 View Controller ,因为我们希望在我们输入完成点击 Return 之后,键盘会自动弹回去。在 SecondViewController.swift
里面添加 UITextFieldDelegate
并实现 textFieldShouldReturn
委托方法,在方法里,通过 resignFirstResponder
把键盘弹回去:
// UITextField Delegate
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
我们希望用户在点击背景图片的时候就可以把键盘收回来,我们可以重写 touchsBegan
方法,在里面加上 endEditing
方法:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
定义两个属性来获取文本框中的值,切换到 Assistant 视图,通过鼠标右键拖拽新建两个变量:
然后我们再新建一个 IBAction ,用来处理 Add 按钮的点击事件:
在点击事件里,我们希望完成以下任务:
- 在 todoManager 里面添加一个 TODO 项
- 把键盘收起
- 清空 TextField 中的内容
- TabBar 切换到 TODO 那个标签下,即时查看结果
OK完成之后的 addBtnClick
方法如下:
@IBAction func addBtnClick(sender: AnyObject) {
todoManager.addTask(todoText.text, desc: descText.text)
self.view.endEditing(true)
todoText.text = ""
descText.text = ""
self.tabBarController?.selectedIndex = 0
}
这样,添加 TODO 的任务就完成了。
删除数据
删除数据和 Objective-C 版本的接口是完全一样的,通过 commitEditingStyle
方法实现。打开 FirstViewController.swift 文件,先在代码中添加一个 TableView 的属性,方便我们刷新数据:
删除其实也就是删除掉 todoManager
的 todos
数组里面的对应数据而已,我们可以用 removeAtIndex
实现,记得reloadData
刷新 TableView:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if(editingStyle == UITableViewCellEditingStyle.Delete) {
todoManager.todos.removeAtIndex(indexPath.row)
}
todoTableView.reloadData()
}
测试
基本的开发工作到此就结束啦,我们可以运行应用跑跑看。
首先添加一个 TODO:
点击 Add 之后可以看到 TableView 里已经有了添加的 TODO 项:
滑动可以看到删除按钮:
点击删除,删除成功:
小结
不知道各位看到这里感觉如何,反正我感觉:水爆了!也没什么深奥的技术点,也没什么创新的东西,就是一个中规中矩的小应用而已。
是的,确实这样。不过希望通过这样一个简单的例子可以和大家一起熟悉一下 Swift ,熟悉一下这个新来的小伙伴^_^
完整的项目源码可以点击这里下载。玩的开心。
用 Swift 开发一个 TODO 应用的更多相关文章
- 使用Swift开发一个MacOS的菜单状态栏App
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52054107 ...
- Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)
在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...
- swift开发度假计划app
用swift开发一个完整的度假地app,设计到布局.数据绑定.数据编辑.页面导航等:适合初学者: github:(git@github.com:Frankltf/ios-swift-app.git)
- Swift开发语法
Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...
- Swift 开发语法
文/Tuberose(简书作者)原文链接:http://www.jianshu.com/p/5e2d4c34f18e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 简介 Swift 语 ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- swift开发多线程篇 - 多线程基础
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
- Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...
- iOS——Swift开发中的单例设计模式(摘译,非原创)
最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...
随机推荐
- 图像局部显著性—点特征(SIFT为例)
基于古老的Marr视觉理论,视觉识别和场景重建的基础即第一阶段为局部显著性探测.探测到的主要特征为直觉上可刺激底层视觉的局部显著性--特征点.特征线.特征块. SalientDetection 已经好 ...
- Visual Basic for Application
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'The note of Visual Basic for Applicati ...
- wx小程序开发 1:小程序代码构成
官网学习地址:https://developers.weixin.qq.com/miniprogram/dev/quickstart/basic/introduction.html 1: 2:待续.. ...
- day35-1 类的三大特性---继承,以及类的派生
目录 类的继承 继承的特性 类的派生 类的组合 类的继承 继承是为了拿到父类的所有东西 继承的特性 减少代码的冗余 Python中父类和子类的对应关系是多对多 使用__bases__方法获取对象继承的 ...
- List集合的特有功能概述和测试
List集合的特有功能概述和测试A:List集合的特有功能概述void add(int index,E element)E remove(int index)E get(int index)E set ...
- 无需编写代码,API业务流程测试,零代码实现
引言 除了测试单个接口,我们常常需要对多个有数据或者逻辑关联的接口进行业务流程测试,例如获取验证码-注册-登录.传统测试业务流程需要编写一系列测试代码,现在通过eoLinker全UI界面,无需编写任何 ...
- 【剑指Offer】33、丑数
题目描述: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数 ...
- (C/C++学习)1.C++中vector的使用
说明:vector是C++中一个非常方便的容器类,它用于存放类型相同的元素,利用成员函数及相关函数可以方便的对元素进行增加或删除,排序或逆序等等,下面将对这些功能一一叙述. 一.vector的第一种用 ...
- 关于虚拟机中克隆的linux为什么不能开启网络服务
将centos克隆了一份,启动后并配置好文件,发现网络服务中只有lo(loopback),而网卡(eth0)没有启动,一开始以为是通信模式(bridged,NAT,host-only)的选择问题,最后 ...
- 【codeforces 483B】Friends and Presents
[链接] 我是链接,点我呀:) [题意] [题解] 我们可以二分n的值,设为mid 那么对于n=mid 我们可以算出来以下3个东西 temp1 = n/x; temp2 = n/y; temp3 = ...