swift实现通讯录的增、删功能

初学 swift,今天使用swift实现了一个简单通讯录的增删功能,功能简单,逻辑清晰,大家共勉。

首先,在 AppDelegate.swift 中创建导航控制器,把 ViewController 设置为根视图控制器

//
//  AppDelegate.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        // 创建导航控制器,并设置根视图控制器
        window?.rootViewController = UINavigationController(rootViewController: ViewController())
        
        // Override point for customization after application launch.
        return true
    }

接下来,创建好我们需要的类,方便后续的工作,具体类的功能已标注,如下图:


创建不同功能的类

第一步:在 ContactManager.swift 中实现模型的 增、删 功能

//
//  ContactManager.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

class ContactManager: NSObject {

    // 将联系人管理类声明为单例类,管理所有联系人的操作:增、删
    static let shareIntance:ContactManager = {
    
        let contactManager = ContactManager()
        return contactManager
    }()
    
    // 所有联系人的数组
    var contactArray:[Contact] = [Contact]()
    // 增加:
    func addContact(contact:Contact){
        // swift 中添加到数组中用 .append()
        contactArray.append(contact)
    }
    // 删除:
    func removeContactByIndexPath(indexPath:NSIndexPath)
    {
        contactArray.removeAtIndex(indexPath.row)
    }
}

第二步:在模型Contact.swift中,创建属性,重载初始化方法:

//
//  Contact.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

class Contact: NSObject {
    // 创建属性
    var name:String?
    var gender:String?
    var age:String?
    var phone:String?
    
    // 重载初始化方法
    init(name:String, gender:String, age:String, phone:String) {
        super.init()
        self.name = name
        self.gender = gender
        self.age = age
        self.phone = phone
    }
}

第三步:在自定义 ContactCell.swift 中,关联xib文件中的属性:

//
//  ContactCell.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

class ContactCell: UITableViewCell {

    // 将xib中的label拖成属性
    @IBOutlet var nameL: UILabel!
    
    @IBOutlet var ageL: UILabel!
    
    @IBOutlet var genderL: UILabel!
    
    @IBOutlet var phoneL: UILabel!
    
    // 根据contact给cell里面的标签赋值
    func cellWithContact(contact:Contact){
 
        nameL.text = contact.name
        ageL.text = contact.age
        genderL.text = contact.gender
        phoneL.text = contact.phone

    }
}

第四步:在 ViewController.swift 中铺放界面,创建 tableView,注册ContactCell,并实现代理中的方法

//
//  ViewController.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

        // 懒加载tableView
        lazy var tableView:UITableView = {
        let tableV = UITableView(frame: UIScreen.mainScreen().bounds,style: UITableViewStyle.Plain)
        tableV.delegate = self
        tableV.dataSource = self
        return tableV
    }()

// viewDidLoad
 override func viewDidLoad() {
        super.viewDidLoad()
        
        // 添加十个联系人
        for i in 0..<10
        {
            let contact = Contact(name: "联系人\(i)", gender: "男", age: "2\(i)", phone: "111-123\(i)")
            ContactManager.shareIntance.addContact(contact)
        }
        // 添加 tableView 视图
        view.addSubview(tableView)

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addAction:")
    }
}

在延展中遵守协议,并实现协议中的方法:
延展的写法 // extension 本类名:协议名{ }
注意:延展是写在class类外面的(大括号之外)

extension ViewController:UITableViewDelegate,UITableViewDataSource{
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return   ContactManager.shareIntance.contactArray.count
    }
    
    // 返回cell
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ContactCell // cell 此时是 UITableViewCell 类型,强制转换成 ContactCell
        // 将 cell 和Contact 关联 
        let contect = ContactManager.shareIntance.contactArray[indexPath.row]
        cell.cellWithContact(contect)
        
        return cell
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 110
    }
}

运行之后的界面效果:


通讯录主界面

主界面搭建好,接下来是点击 cell ,跳转到联系人详情界面,先将界面铺放好,这次用纯代码实现,大家可以根据自己的掌握的熟练程度来选择实现的方式。
在 DetailViewController.swift 文件中:

//
//  DetailViewController.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

class DetailViewController: UIViewController {
    // 声明模型的属性,方便后面的传值
    var contact : Contact?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.whiteColor()
        
        // 姓名
        let lab1 = UILabel(frame: CGRectMake(130, 100, 120, 30))
        lab1.backgroundColor = UIColor.orangeColor()
        lab1.text = contact?.name
        lab1.textAlignment = NSTextAlignment.Center
        view.addSubview(lab1)
        let lab11 = UILabel(frame: CGRectMake(50, 100, 70, 30))
        lab11.text = "name"
        view.addSubview(lab11)
        
        // 性别
        let lab2 = UILabel(frame: CGRectMake(130, 200, 120, 30))
        lab2.backgroundColor = UIColor.orangeColor()
        lab2.text = contact?.gender;
        lab2.textAlignment = NSTextAlignment.Center
        view.addSubview(lab2)
        let lab22 = UILabel(frame: CGRectMake(50, 200, 70, 30))
        lab22.text = "gender"
        view.addSubview(lab22)
        
        // 年龄
        let lab3 = UILabel(frame: CGRectMake(130, 300, 120, 30))
        lab3.backgroundColor = UIColor.orangeColor()
        lab3.text = contact?.age
        lab3.textAlignment = NSTextAlignment.Center
        view.addSubview(lab3)
        let lab33 = UILabel(frame: CGRectMake(50, 300, 70, 30))
        lab33.text = "age"
        view.addSubview(lab33)
        
        // 号码
        let lab4 = UILabel(frame: CGRectMake(130, 400, 120, 30))
        lab4.backgroundColor = UIColor.orangeColor()
        lab4.text = contact?.phone
        lab4.textAlignment = NSTextAlignment.Center
        view.addSubview(lab4)
        let lab44 = UILabel(frame: CGRectMake(50, 400, 70, 30))
        lab44.text = "phone"
        view.addSubview(lab44)

        // Do any additional setup after loading the view.
    }

在 ViewController.swift 的延展 extension 中实现协议中的方法 didSelect 实现点击 cell 跳转到对应联系人详情界面:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let detailVC = DetailViewController()
        
        detailVC.contact = ContactManager.shareIntance.contactArray[indexPath.row]
        
        detailVC.navigationItem.title = "联系人详情"
        
        navigationController?.pushViewController(detailVC, animated: true)
    }

运行之后,点击对应的 cell 界面效果如下:


联系人详情界面

接下来铺放添加联系人界面

//
//  AddViewController.swift
//  Swift03-1
//
//  Created by 奇二世界 on 16/6/14.
//  Copyright © 2016年 YMN. All rights reserved.
//

import UIKit

class AddViewController: UIViewController {
     �// 懒加载textField
    lazy var tf:UITextField = {
        var tf = UITextField(frame:CGRectMake(130, 100, 100, 30))
        tf.borderStyle = UITextBorderStyle.RoundedRect
        tf.placeholder = "请输入姓名"
        return tf
    }()
    
    lazy var tf2:UITextField = {
        var tf2 = UITextField(frame:CGRectMake(130, 200, 100, 30))
        tf2.borderStyle = UITextBorderStyle.RoundedRect
        tf2.placeholder = "请输入性别"
        return tf2
    }()
    
    lazy var tf3:UITextField = {
        var tf3 = UITextField(frame:CGRectMake(130, 300, 100, 30))
        tf3.borderStyle = UITextBorderStyle.RoundedRect
        tf3.placeholder = "请输入年龄"
        return tf3
    }()
    
    lazy var tf4:UITextField = {
        var tf4 = UITextField(frame:CGRectMake(130, 400, 100, 30))
        tf4.borderStyle = UITextBorderStyle.RoundedRect
        tf4.placeholder = "请输入号码"
        return tf4
    }()
    
    lazy var btn1:UIButton = {
        var b1 = UIButton(frame: CGRectMake(120, 500, 50, 30))
        b1.backgroundColor = UIColor.brownColor()
        b1.setTitle("取消", forState: UIControlState.Normal)
        b1.addTarget(self, action: "cancelAction:", forControlEvents: UIControlEvents.TouchUpInside)
        return b1
    }()
    
    lazy var btn2:UIButton = {
        var b2 = UIButton(frame: CGRectMake(200, 500, 50, 30))
        b2.backgroundColor = UIColor.brownColor()
        b2.setTitle("保存", forState: UIControlState.Normal)
        b2.addTarget(self, action: "addAction:", forControlEvents: UIControlEvents.TouchUpInside)
        return b2
    }()
    
    // 取消方法:点击 取消 之后,不做任何操作,直接跳转到主界面
    func cancelAction(btn:UIButton){

        navigationController?.popToRootViewControllerAnimated(true)
    }
    
    // 添加方法
    func addAction(btn:UIButton){
            let contact = Contact(name:tf.text!, gender:tf2.text!, age:tf3.text!, phone:tf4.text!)
            ContactManager.shareIntance.contactArray.append(contact)
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.whiteColor()
        // 添加button
        view.addSubview(btn1)
        view.addSubview(btn2)
        // 创建提示标签
        let lab11 = UILabel(frame: CGRectMake(50, 100, 70, 30))
        lab11.text = "name"
        view.addSubview(lab11)
        
        view.addSubview(tf)
        
        let lab22 = UILabel(frame: CGRectMake(50, 200, 70, 30))
        lab22.text = "gender"
        view.addSubview(lab22)
        
        view.addSubview(tf2)
        
        let lab33 = UILabel(frame: CGRectMake(50, 300, 70, 30))
        lab33.text = "age"
        view.addSubview(lab33)
        
        view.addSubview(tf3)
        
        let lab44 = UILabel(frame: CGRectMake(50, 400, 70, 30))
        lab44.text = "phone"
        view.addSubview(lab44)
        
        view.addSubview(tf4)

        // Do any additional setup after loading the view.
    }

在 ViewController.swift 的 viewDidLoad() 中,添加 UIBarButtonItem 进行界面跳转:

navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addAction:")

实现对应的点击方法 addAction:

func addAction(btn:UIBarButtonItem){
        let addVC = AddViewController()
        addVC.navigationItem.title = "添加联系人"
        // 进行界面跳转
        navigationController?.pushViewController(addVC, animated:true)
    }

这一步之后,点击“保存”之前,一定要在 ViewController.swift 文件中 实现 viewWillAppear 方法,在视图即将出现之前 刷新 UI 界面,才能看到我们添加的联系人,代码如下:

// viewWillAppear 视图即将出现
    override func viewWillAppear(animated: Bool) {
        super.viewDidAppear(animated)
        tableView.reloadData()        
    }

运行效果界面图,及点击保存之后的界面效果如图:


添加联系人界面

点击“保存”后的效果

最后一步就是实现滑动 cell 的删除功能,点击"Delete"之后,该对应的 cell 就在主界面上被删除了。:
在 ViewController.swift 的 延展 中,实现协议中的方法:

// 删除cell方法:
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == UITableViewCellEditingStyle.Delete
        {    
        ContactManager.shareIntance.removeContactByIndexPath(indexPath)            
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
        }
    }

删除效果如图:


删除效果界面

以上就是用 swift 实现的通讯录中添加、删除联系人的简单功能,瑕疵比较多,共勉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容