Swift语言学习---------高级之简单通讯录制作

效果图:

文件目录:

示例代码如下:

Contact.swift

import UIKit

class Contact: NSObject {

    //声明属性
    var name:String?
    var phone:String?
    var gender:String?
    var age:String?

    //初始化方法
    init(name:String ,phone:String,gender:String,age:String){

        self.name = name
        self.phone = phone
        self.gender = gender
        self.age = age

    }

}

DataHelper.swift

import UIKit

class DataHelper: NSObject {
    //谨记:在Swift中创建单例对象
    static let shareInstance:DataHelper = DataHelper()

    //声明一个数组属性,用来存放所有联系人
    var modelArray:Array = Array<Contact>()

    //声明数据处理的方法
//1.向数组中添加联系人
    func addContact(contact:Contact){

     modelArray.append(contact)

    }

//2.从数组中移除一个联系人
    func deleteContactWithPath(indeaPath:NSIndexPath){

    modelArray.removeAtIndex(indeaPath.row)

    }

//3.获取有多少个联系人
    func countOfModels()->Int{

       return modelArray.count

    }
//4.根据indexPath 查找某个联系人
    func getContactWithIndexPath(indexPath:NSIndexPath)->Contact{

    return modelArray[indexPath.row]

    }

//5.根据fromIndexPath和ToIndexPath实现元素的移动
func moveContact(fromIndexPath:NSIndexPath,toIndexPath:NSIndexPath){

   let contact = modelArray[fromIndexPath.row]
    //先更新数据源,想要移动先删除对应位置元素,然后再插入一个元素
    modelArray.removeAtIndex(fromIndexPath.row)
    modelArray.insert(contact,atIndex: toIndexPath.row)

}

}

contactCell.swift

import UIKit

class contactCell: UITableViewCell {

    //‘!‘表示只取里面的值
    @IBOutlet var nameLabel: UILabel!

    @IBOutlet var phoneLabel: UILabel!

    @IBOutlet var genderLabel: UILabel!

    @IBOutlet var ageLabel: UILabel!

    //声明一个计算属性的方法  !/?表示必须有值
    //contact这里声明为计算属性
    var contact:Contact!{
     get{
        return nil

        }

     set{
        //会自动创建一个newValue作为参数,接收外部传过来的对象
        nameLabel.text  = newValue?.name
        phoneLabel.text = newValue?.phone
        genderLabel.text = newValue?.gender
        ageLabel.text = newValue?.age

        }

    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

ComtactLiatTableViewController.swift

import UIKit

class ComtactLiatTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

         self.navigationItem.rightBarButtonItem = self.editButtonItem()

        //注册cell  (使用StroyBoard必须注册cell)
        self.tableView.registerNib(UINib(nibName: "contactCell", bundle: nil), forCellReuseIdentifier:  "cell")

        //创建联系人对象
        let contact:Contact = Contact(name: "张三", phone: "123", gender: "男", age: "20")
        //将联系人添加到数组中
        DataHelper.shareInstance.addContact(contact)

    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //计算有多少行
        return DataHelper.shareInstance.countOfModels()
    }

    //override为继承父类的方法
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

          //这里用到了强转 as!contactCell强转的标志
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)as!contactCell

        //获取某个联系人对象
        let contact:Contact = DataHelper.shareInstance.getContactWithIndexPath(indexPath)

        //设置cell
//       cell.nameLabel.text = contact.name

        //设置models的赋值过程
        cell.contact = contact

        return cell

 }

    //点击cell时,实现的方法
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        //根据storyBoardID获取 storyboard中的某个视图控制器
        //as!ContactDetailViewController 这里使用了强制类型转化
     let detailVC = self.storyboard?.instantiateViewControllerWithIdentifier("DetailVC")as!ContactDetailViewController

        //根据indexPath获取contact对象
        //使用单例添加联系人
       let contact =  DataHelper.shareInstance.getContactWithIndexPath(indexPath)

        //属性传值
        detailVC.contact = contact

        //push到下一个页面
        self.navigationController?.pushViewController(detailVC, animated: true)

    }

    //cell是否处于编辑状态,返回值为Bool类型
    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }

    // 提交编辑类型 (是删除还是添加)
    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {

            //删除数据   调用单例的方法
            DataHelper.shareInstance.deleteContactWithPath(indexPath)

            //删除UI   (先更新数据源,再更新UI界面)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

        } else if editingStyle == .Insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }
    }

    //cell移动的方法
    override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {

        //在单例类中已经声明了相关的方法
        DataHelper.shareInstance.moveContact(fromIndexPath, toIndexPath: toIndexPath)

    }

    //cell是否移动返回值为Bool类型
    override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the item to be re-orderable.
        return true
    }

    override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

        //cell所在行的内部设置
        let action1 = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "取消关注") { (action:UITableViewRowAction, indexPath:NSIndexPath) -> Void in

            print("点击了取消关注按钮会取消")

        }

        let action2 = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "标记为已读") { (action:UITableViewRowAction, indexPath:NSIndexPath) -> Void in

            print("点击了标记为已读按钮会取消标记")

        }
       //返回
        return[action1,action2]

 }

    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        //as!AddContactViewController 强制类型转化标识
        let NC = segue.destinationViewController as!UINavigationController

        let addContactVC =  NC.viewControllers.first as!AddContactViewController

        //闭包的实现部分   利用闭包实现tabelView的页面刷新
        addContactVC.block = {
            Back in
            self.tableView.reloadData()
        }

    }

}

ContactDetailViewController.swift

import UIKit

class ContactDetailViewController: UIViewController {
    @IBOutlet var nameLabel: UILabel!

    @IBOutlet var phoneLabel: UILabel!

    @IBOutlet var genderLabel: UILabel!

    @IBOutlet var ageLabel: UILabel!

    //声明存储属性(详情展示页面使用存储属性是因为程序在执行过程中所具有的先后顺序

    var contact:Contact?    //后面‘?‘如果不给这个属性赋值系统会默认给这个属性一个值,如果不使用‘?‘就必须手动给其一个值

    override func viewDidLoad() {
        super.viewDidLoad()

        nameLabel.text = contact!.name

        phoneLabel.text = contact!.phone

        genderLabel.text = contact!.gender

        ageLabel.text = contact!.age

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

AddContactViewController.swift

import UIKit
//类型重定义
typealias Back = () ->Void
//其中()->void是就类型, back给旧类型重新其的名字
class AddContactViewController: UIViewController {
    //声明闭包
    var block:(Back)?

    @IBOutlet var nameTextField: UITextField!

    @IBOutlet var phoneTextField: UITextField!

    @IBOutlet var genderTextField: UITextField!

    @IBOutlet var ageTextField: UITextField!

    @IBAction func didClickDoneBI(sender: AnyObject) {

        //1.将填写的数据封装成contact对象  用
        let contact:Contact = Contact(name:nameTextField.text!, phone: phoneTextField.text!, gender: genderTextField.text!, age: ageTextField.text!)

     //保存数据
        DataHelper.shareInstance.addContact(contact)

        //调用闭包让列表页面进行刷新
        block!()

        //返回到列表页面
        dismissViewControllerAnimated(true, completion: nil)

    }

    override func viewDidLoad() {
        super.viewDidLoad()

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}
时间: 2024-10-14 00:12:43

Swift语言学习---------高级之简单通讯录制作的相关文章

【iOS开发每日小笔记(六)】Swift语言学习的入门随想

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

初步swift语言学习笔记9(OC与Swift杂)

笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift 语言出来后,可能新的项目直接使用swift来开发.但可能在过程中会遇到一些情况.某些已用OC写好的类或封装好的模块.不想再在swift 中再写一次.哪就使用混编.这个在IOS8中是同意的. 先中简单的入手,先研究在同一个project

swift语言学习博文精选

初探swift语言的学习笔记九(OC与Swift混编) Objective-C 与 Swift 混编之路 Swift项目兼容Objective-c问题汇总

Swift语言学习之OC和Swift混编

本文转自http://www.helloswift.com.cn/swiftbase/2015/0112/3469.html iOS OC和Swift混编 1.创建一个swift或者oc的工程:我这里是创建的Swift语言的工程,工程名SwiftTest 2.在工程中代码目录下创建一个oc的类,选择oc语言, 会出一个对话框,选择YES          3.这时会在工程里看到下图这样一个头文件           4.在这个头文件里添加你的OC文件的.h文件,就可以在任意swift文件中自行调

Swift -- 语言指南--高级运算符

原文地址: http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可

Swift语言学习No.2: 二维数组

之前在教程中学习了二维数组,原本里面很多知识点都不甚了解,后来经过一番资料查找,基本上理解透彻了,做个总结吧. 老规矩,先上代码: class Array2D<T> { let columns: Int let rows: Int var array: Array<T?> init(columns: Int, rows: Int) { self.columns = columns self.rows = rows array = Array<T?>(count:rows

C语言学习_一个简单程序的解释与C学习方法概括

简单计算器程序示例: 1 # include <stdio.h> //1.头文件 2 3 //2.加法函数 4 int add(int a,int b)//3.函数定义方式 5 { //4.函数体 6 return a+b; //5.函数返回 7 } 8 //减法 9 int move(int a,int b) 10 { 11 return a-b; 12 } 13 14 //乘法 15 int mul(int a,int b) 16 { 17 return a*b; 18 } 19 20 /

如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?

[编者按]本文作者 Joyce Echessa 是渥合数位服务创办人,毕业于台湾大学,近年来专注于协助客户进行 App 软体以及网站开发.文中作者通过示例介绍用 ios-charts 库创建简易美观的图表,有助于开发者在应用中生动形象地向用户展示数据.本文系 OneAPM 工程师编译整理: 呈现大量数据时,比起表格中一行行枯燥的数据,使用图表来形象地表示数据可以帮助用户更好地理解.在图表中,不需要通读所有数据资料,便能很容易地了解数据模式,从而获取关键信息.图表的使用在商业 App 和健身 Ap

Swift语言学习(四)字符串与Array等集合的使用

Swift 提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String.Swift还提供了Array和Dictionary这两种集合类型的增强版本. 我们知道在iOS开发中用的最多的基础类型可能就数字符串了,以及一些集合类型的使用,下面我们来简单学习下字符串String以及Array.Dictionary等集合类型的使用方法 一.字符串  1.字符串的字面量 , 例如"jeck&qu