Swift 简单的通讯录

Swift 通讯录实战

1、功能需求

  • 整个项目由三个界面构成:首页面(全部联系人),添加联系人界面和联系人详情界面
  • 整个项目使用纯代码编程
  • 数据处理方面使用一个工具类,处理所有数据的增删改查。
  • 首页由UITableView展示联系人的详情信息,上方的导航栏按钮分别是添加练习人按钮和编辑按钮。点击添加联系人按钮跳转到添加联系人页面,点击编辑按钮使UITableView进入可编辑状态,可以移动和删除联系人
  • 添加联系人由两个UITextField和一个UIButton组成,UITextField分别是姓名和电话号码,UIButton是保存按钮。点击保存按钮实现增加或修改联系人信息,并刷新首页UI
  • 联系人信息界面只需要展示首页传过来的的联系人信息

2、数据处理类

  • 数据处理类是整个通讯录项目中对数据源做增删改查的类
  • 当外界需要数据的时候,可以提供必要条件直接在数据处理类中获取到相应的数据
  • 数据处理类的有点是可以减少ViewController中的代码,而且在各个类之间起到了一个解耦的作用,使各个类的耦合度降到最低
  • 在真正的项目中建议一个数据建立一个对应的数据处理类,让专门的类做专门的事,实现MVC的分层思想

3、界面展示

    

    

4、代码展示

创建工程时语言勾选Swift

AppDelegate.swift

 1     func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
 2         // Override point for customization after application launch.
 3         // 创建window
 4         self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
 5         self.window?.backgroundColor = UIColor.whiteColor()
 6         self.window?.makeKeyAndVisible()
 7
 8         let rootVC : ContactListTableViewController = ContactListTableViewController()
 9         let rootNVC : UINavigationController = UINavigationController(rootViewController: rootVC)
10         // 设置根视图控制器
11         self.window?.rootViewController = rootNVC
12
13         return true
14     }

ContactListTableViewController.swift 首页 -- 展示联系人列表

  1 import UIKit
  2
  3 class ContactListTableViewController: UITableViewController {
  4
  5     override func viewDidLoad() {
  6         super.viewDidLoad()
  7         self.title = "通讯录"
  8         // 设置导航控制器样式
  9         self.navigationController?.navigationBar.barStyle = UIBarStyle.Black
 10         self.navigationController?.navigationBar.backgroundColor = UIColor.blackColor()
 11         self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
 12         // 左按钮 -- 添加联系人按钮
 13         self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: Selector("addButtonAction"))
 14         // 右按钮 -- 编辑
 15         self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "编辑", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editAction"))
 16
 17     }
 18
 19     // MARK: - 添加按钮点击事件
 20     func addButtonAction() -> Void {
 21         // 跳转新的页面
 22         let addVC = AddContactViewController()
 23         // 实现闭包的回调
 24         addVC.myBlock = {
 25             () -> Void in
 26             self.tableView.reloadData()
 27         }
 28         self.navigationController?.pushViewController(addVC, animated: true)
 29
 30     }
 31
 32     // MARK: - 编辑按钮点击事件
 33     func editAction() {
 34         self.tableView.setEditing(!self.tableView.editing, animated: true)
 35     }
 36
 37     // MARK: - Table view data source
 38     // MARK: - 分区数
 39     override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
 40         return 1
 41     }
 42
 43     // MARK: - 分区行数
 44     override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 45         // #warning Incomplete implementation, return the number of rows
 46         return DataHandle.shareInstence.count
 47     }
 48
 49     // MARK: - 返回cell
 50     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
 51
 52         var cell = tableView.dequeueReusableCellWithIdentifier("cell")
 53         if cell == nil {
 54             cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
 55         }
 56         let contact = DataHandle.shareInstence.findContactWithIndex(indexPath.row)
 57         cell?.textLabel?.text = contact.name
 58         cell?.detailTextLabel?.text = contact.phone
 59         return cell!
 60     }
 61
 62     // MARK: - 点击cell
 63     override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
 64         let addVC = AddContactViewController()
 65         // 属性传值
 66         let contact = DataHandle.shareInstence.findContactWithIndex(indexPath.row)
 67         addVC.contact = contact
 68         addVC.index = indexPath.row
 69         addVC.myBlock = {
 70             () -> Void in
 71             self.tableView.reloadData()
 72         }
 73         self.navigationController?.pushViewController(addVC, animated: true)
 74     }
 75
 76     // Override to support conditional editing of the table view.
 77     // MARK: - 设置所有cell可编辑
 78     override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
 79         // Return false if you do not want the specified item to be editable.
 80         return true
 81     }
 82
 83     // Override to support editing the table view.
 84     // MARK: - 提交编辑样式
 85     override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
 86         if editingStyle == .Delete {
 87             DataHandle.shareInstence.removeContactWithIndex(indexPath.row)
 88             tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
 89         } else if editingStyle == .Insert {
 90             // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
 91         }
 92     }
 93
 94     // Override to support conditional rearranging of the table view.
 95     // MARK: - 设置所有cell可移动
 96     override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
 97         // Return false if you do not want the item to be re-orderable.
 98         return true
 99     }
100
101     // Override to support rearranging the table view.
102     // MARK: - 移动
103     override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {
104         DataHandle.shareInstence.changeContact(fromIndexPath.row, toIndexPath: toIndexPath.row)
105         self.tableView.reloadData()
106     }
107
108 }

AddContactViewController.swift -- 添加联系人、修改联系人信息

 1 import UIKit
 2
 3 class AddContactViewController: UIViewController {
 4
 5     // 声明控件属性
 6     var nameTextField : UITextField?
 7     var phoneTextField : UITextField?
 8     var saveButton : UIButton?
 9     // 属性传值
10     // 要修改的联系人信息
11     var contact : Contact?
12     // 要修改的联系人下标
13     var index : Int?
14     // 重定义,相当于typedef
15     typealias BLOCK = () -> Void
16     // 声明一个闭包属性
17     var myBlock : BLOCK?
18
19
20     override func viewDidLoad() {
21         super.viewDidLoad()
22         self.view.backgroundColor = UIColor.whiteColor()
23         // 设置控件frame
24         self.nameTextField = UITextField(frame: CGRect(x: 30, y: 150, width: self.view.frame.size.width - 60, height: 30))
25         self.phoneTextField = UITextField(frame: CGRect(x: CGRectGetMinX(self.nameTextField!.frame), y: CGRectGetMaxY(self.nameTextField!.frame) + 20, width: CGRectGetWidth(self.nameTextField!.frame), height: CGRectGetHeight(self.nameTextField!.frame)))
26
27         if self.contact != nil {
28             // 显示要修改的数据
29             self.nameTextField?.text = self.contact?.name
30             self.phoneTextField?.text = self.contact?.phone
31         } else {
32             // 添加
33             self.nameTextField?.placeholder = "请输入姓名"
34             self.phoneTextField?.placeholder = "请输入电话号码"
35         }
36
37         self.view.addSubview(self.nameTextField!)
38         self.view.addSubview(self.phoneTextField!)
39
40         self.saveButton = UIButton(type: UIButtonType.System)
41         self.saveButton?.frame = CGRect(x: CGRectGetMinX(self.phoneTextField!.frame), y: CGRectGetMaxY(self.phoneTextField!.frame) + 20, width: CGRectGetWidth(self.phoneTextField!.frame), height: CGRectGetHeight(self.phoneTextField!.frame))
42         self.saveButton?.setTitle("保存", forState: UIControlState.Normal)
43         self.saveButton?.backgroundColor = UIColor.orangeColor()
44         self.saveButton?.addTarget(self, action: Selector("saveAction"), forControlEvents: UIControlEvents.TouchUpInside)
45         self.view.addSubview(self.saveButton!)
46     }
47
48     // MARK: - 保存按钮点击事件
49     func saveAction() {
50         // 点击保存按钮,将新的联系人添加到数组中
51         let newContact = Contact(name: self.nameTextField!.text!, phone: self.phoneTextField!.text!)
52         if self.contact != nil {
53             // 修改
54             DataHandle.shareInstence.updataContactWithIndex(newContact, index: self.index!)
55         } else {
56             // 添加
57             DataHandle.shareInstence.addContactToArray(newContact)
58         }
59
60         // 闭包传值(刷新UI)
61         self.myBlock!()
62         self.navigationController?.popViewControllerAnimated(true)
63     }
64 }

Contact.swift -- 联系人类

 1 import UIKit
 2
 3 class Contact: NSObject {
 4     // 声明属性
 5     var name : String?
 6     var phone : String?
 7
 8     // 初始化方法
 9     init(name : String, phone : String) {
10         super.init()
11         self.name = name
12         self.phone = phone
13     }
14 }

DataHandle.swift -- 数据处理类

 1 class DataHandle: NSObject {
 2     var contactArray = Array<Contact>()
 3     // 声明计算属性
 4     var count : Int {
 5         get {
 6             return contactArray.count
 7         }
 8     }
 9
10     static let shareInstence = DataHandle()
11
12     // 单例
13     // 为了防止在外部被再次初始化
14     private override init() {
15         super.init()
16     }
17
18     // MARK: - 添加联系人
19     func addContactToArray (contact : Contact) {
20         self.contactArray.append(contact)
21     }
22
23     // MARK: - 根据下标获取联系人
24     func findContactWithIndex (index : Int) -> Contact {
25         return self.contactArray[index]
26     }
27
28     // MARK: - 更新联系人信息
29     func updataContactWithIndex (newContact : Contact, index : Int) -> Void {
30         self.contactArray.removeAtIndex(index)
31         self.contactArray.insert(newContact, atIndex: index)
32     }
33
34     // MARK: - 删除联系人
35     func removeContactWithIndex (index : Int) -> Void {
36         self.contactArray.removeAtIndex(index)
37     }
38
39     // MARK: - 移动
40     func changeContact (fromIndexPath : Int, toIndexPath : Int) {
41         let contact = self.contactArray[fromIndexPath]
42         self.contactArray .removeAtIndex(fromIndexPath)
43         self.contactArray.insert(contact, atIndex: toIndexPath)
44     }
45 }
时间: 2024-10-18 14:40:25

Swift 简单的通讯录的相关文章

iOS开发——UI高级Swift篇&amp;swift简单总结tableView

swift简单总结tableView 今天来总结一个很简单的问题,真心说出来丢脸,但是由于本人在写swift项目的时候总是发现Xib不能加载,而且不止一次,所以就简单的总结一下! 一:简单的使用缓存池 1.设置StoryBoard中cell的ID 2.在控制器的Cell中就可以直接使用ID创建了 1 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UI

Swift简单入门教程:30分钟玩转Swift

通常来说,编程语言教程中的第一个程序应该在屏幕上打印“Hello, world”.在 Swift 中,可以用一行代码实现:    println("hello, world") 如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式——在 Swift 中,这行代码就是一个完整的程序.你不需要为了输入输出或者字符串处理导入一个单独的库.全局作用域中的代码会被自动当做程序的入口点,所以你也不需要main函数.你同样不需要在每个语句结尾写上分号. 这个教程会通过一系列编程

一个简单的通讯录。。。

上课的时候老师布置了一个作业,利用结构体实现一个简单地通讯录,这可是我们大一的时候学期末的课设题目啊,不过还好现在的水平比之前高了那么一点.. 实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 这个是通讯录的主要功能. 这个比较大,所以我们写在三个文件里.

Swift简单新闻APP实例

1.利用swift开发一个简单的新闻APP 主要利用IOS的UITableViewController,和UIwebView,再加上HTTP请求返回json数据并解析 2.APP演示 主界面 点击新闻进入详情 下拉列表刷新 3.APPDelegate.swif // // AppDelegate.swift // UITableViewControllerDemo // // Created by 赵超 on 14-6-24. // Copyright (c) 2014年 赵超. All rig

最简单的通讯录,实现了联系人的 增删该查

原文:最简单的通讯录,实现了联系人的 增删该查 源代码下载地址:http://www.zuidaima.com/share/1550463724014592.htm omcat servlet jsp db 最简单的通讯录 实现了联系人的 增删该查 数据库在压缩包内 经验证该分享代码有乱码的问题,界面也很粗糙,导入db也会有乱码问题.大家可以酌情下载,不过对初级工程师有借鉴意义. 登陆页面 http://localhost:端口/项目名称/login.html 管理页面 jdbc的连接配置需要手

数据库连接学习--简单的通讯录

为了做毕业设计,学习了Java,然后就要连接数据库,为了连接数据库就学习做了一个简单的小项目,通讯录(现在只有添加的功能),成功连接数据库 首先看看我的WEB首页吧: 比较简单,然后是填加联系人页面 我的数据库连接的代码先抛出来,毕竟这是我做通讯录学习的重点, package s2.jsp.zhangxiao.dao; import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.ResultSet;

【Android Demo】简单手机通讯录

Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 Android App 中一个最最最常用的控件了,所以如何让 ListView 流畅运行,获取良好的用户体验是非常重要的. 对 ListView 优化就是对 Adapter 中的 getView 方法进行优化. 核心内容: 1.获取手机通讯录 2.数据封装 3.创建 Adapter 4.优化适配器

swift 简单语句 控制流语句

在 Swift 中.有两种类型的语句:简单语句和控制流语句.简单语句是最常见的.用于构造表达式和声明.控制流语句则用于控制程序运行的流程,Swift 中有三种类型的控制流语句:循环语句.分支语句和控制传递语句. 循环语句用于反复运行代码块.分支语句用于运行满足特定条件的代码块:控制传递语句则用于改动代码的运行顺序.在稍后的叙述中,将会具体地介绍每一种类型的控制流语句. 是否将分号(;)加入到语句的结尾处是可选的.但若要在同一行内写多条独立语句,请务必使用分号. GRAMMAR OF A STAT

Swift 简单介绍 - 苹果最新的编程语言

Swift 真的能够说是最新的编程语言了,2014wwdc刚刚公布,以下来了解一下都有哪些特点. 首先感谢原作者,主要内容是借鉴他的,參考链接 http://zh.lucida.me/blog/an-introduction-to-swift/ 关于 这篇文章简要介绍了苹果于WWDC 2014公布的编程语言--Swift. 前言 在这里我觉得有必要提一下Bret Victor的Inventing on Principle.Swift编程环境的大部分概念都源自于Bret这个演讲. 接下来进入正题.