用 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 ,熟悉一下这个新来的小伙伴^_^

完整的项目源码可以点击这里下载。玩的开心。

时间: 2024-10-10 14:26:30

用 Swift 开发一个 TODO 应用的相关文章

[iOS] 用 Swift 开发一个 TODO 应用

原文地址:http://blog.callmewhy.com/2014/09/15/todo-list-in-swift/ 背景 相信不少 iOS 程序员对于 Swift 依旧持以观望的态度,一来是这小家伙刚出来没几天,本身还处于完善的阶段:二来是学习的成本较高,看完官方文档怎么也要个几天的时间:三来是反正最近几年很难在工程项目里推广使用,工作又用不到,那我学个锤子呐. 是的,我一开始也是这么想的.直到有一天,我遇到了它:Swift Tutorial - To Do List App.这是 Yo

Swift 编写的一个 ToDo App

以下所有代码都是使用Xcode Version 6.0.1 (6A317)编写的. 由于团队开发的时候使用stroyboard在合并的时候有诸多不便,所有还是使用.xib文件编写这个ToDo App. 想要实现的功能是:TableView 上可以增加待做选项,并按照时间先后排序,可以实现删除,到点通知功能. 想要实现的效果如下:        步骤: 1.新建一个基于Singal View Application 的工程,然后删掉storyboard,在新建两个新文件 Main.xib 和 Ma

Swift开发语法

Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工具部门总监 Chris Lattner(克里斯·拉特纳) 开始着手 Swift 编程语言的设计工作 用一年时间,完成基本架构 Swift 大约历经 4 年的开发期,2014 年 6 月发表 克里斯·拉特纳 ) 特色 苹果宣称 Swift 的特点是:快速.现代.安全.互动,而且明显优于 Object

Swift开发笔记

Swift开发笔记(一) 刚开始接触XCode时,整个操作逻辑与Android Studio.Visual Studio等是完全不同的,因此本文围绕IOS中控件的设置.事件的注册来简单的了解IOS开发 1.新建一个Xcode项目,项目目录大致如图: 2.在Main.storyboard添加控件 首先要显示右侧的工具栏(Utilities),之后选择显示Object Library,就可以找到常用的一些控件了,然后添加几个控件到界面中 3.将控件和ViewController进行关联 此时要将Ed

五 Swift开发之扩展(Extension)

五 Swift开发之扩展(Extensions) //扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6

Parse 和 Swift 搭建一个像 Instagram

如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用? [编者按]本篇文章作者是Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于Parse特点,打造一款类似Instagram的应用,完整而清晰的步骤,为开发者提供一次绝佳的学习体验.本文系 OneAPM 工程师编译整理. Parse 是一个移动应用开发平台,旗下有个很有意思的产品:Parse Core.它的特色之一是允许应用开发者直接将数据存储

如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?

[编者按]本篇文章作者是Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于Parse特点,打造一款类似Instagram的应用,完整而清晰的步骤,为开发者提供一次绝佳的学习体验.本文系 OneAPM 工程师编译整理. Parse 是一个移动应用开发平台,旗下有个很有意思的产品:Parse Core.它的特色之一是允许应用开发者直接将数据存储在云端,而无需担心设置服务器或重新设计一个 REST API.Parse Core

关于《Swift开发指南》背后的那些事

时间轴(倒叙)2014年8月底在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出2014年7月5日苹果宣布Swift语言二十天后,<Swift开发指南>第一稿交予图灵出版社2014年6月9日苹果宣布Swift语言三天后,启动<Swift开发指南>撰写2014年6月2日凌晨1点(北京时间:)在苹果开发者大会WWDC 2014上,苹果宣布了全新的iOS及OS X平台开发语言S

Linux # 部署OpenStack Swift 开发环境

blog.csdn.net/lzueclipse/article/details/26405753#1536434-qzone-1-61807-cac534f6a16e831f54c45c717ec6acf9 部署OpenStack Swift 开发环境--SAIO - Swift All In One,遇到的问题和解决 - 坚持学习 lzueclipse 一个小白的分布式存储之路 [email protected] - 博客频道 - CSDN.NET blog.sina.com.cn/s/bl