swift3.0 coreData的使用-日记本demo

来源:互联网 发布:arcgis裁剪栅格数据 编辑:程序博客网 时间:2024/06/13 23:32

效果

效果.gif

需求分析

基于官方MasterDetail模板,官方写了很多复杂的coredata逻辑,在此基础上快速开发简单的日记本程序。

- 主要功能:增、删、改、查- 界面用默认的界面,将detail页面改为`UITextView`可编辑- 主页面进行 增、删、查操作- 子页面进行 删、改、查操作

需求很简单,官方模板还添加了按时间排序的操作

创建工程

选择 M-D模式
M-D.png
使用swift和coredata

选择语言和coredata.png

添加数据库

官方给数据库添加了一个时间戳字段,我们再添加一个内容字段就可以了
添加字段.png

改写Detail页面

改成textview,读取数据库中的noteDetail内容字段
需要增加保存和删除操作
由于设置了detailItem:Event这个全局变量是由上一级传递过来的,我们就可以对这行内容直接进行操作

    //当前entity    var detailItem: Event? {        didSet {            // Update the view.            self.configureView()        }    }
//删除    @IBAction func deleteNote(_ sender: Any) {        print("deleted")        let context = self.detailItem?.managedObjectContext        context?.delete(self.detailItem!)          //保存到数据库        self.saveData(context: context!)        _ = self.navigationController?.popViewController(animated: true)    }
//保存数据    func saveObject() {        print("saved")        let newEvent = self.detailItem        let context = self.detailItem?.managedObjectContext        newEvent?.noteDetail = self.detailTextView.text        newEvent?.timestamp = NSDate()        //保存到数据库        self.saveData(context: context!)        //返回        _ = self.navigationController?.popViewController(animated: true)    }
    //保存数据    func saveData(context:NSManagedObjectContext) {        do {            try context.save()        } catch {            let nserror = error as NSError            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")        }    }

在navBarRight上增加一个按钮用于保存

    override func viewDidLoad() {        super.viewDidLoad()        //增加保存按钮        let saveBtn = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(saveObject))        self.navigationItem.rightBarButtonItem = saveBtn        self.title = "写点什么吧..."           self.configureView()    }
    //配置界面 显示日志内容    func configureView() {        if let detail = self.detailItem {            if let textView = self.detailTextView {                textView.text = detail.noteDetail!.description            }        }    }

改写Master页面

- 更改cell展示内容- 点击cell的页面- 更改新增日志按钮的方法- 新增刷新tableview
  • 更改cell展示内容
    cell没有太多要更改的 只是显示样式更改下就行
    //配置cell内容    func configureCell(_ cell: UITableViewCell, withEvent event: Event) {        cell.textLabel!.text = event.noteDetail?.description        cell.detailTextLabel!.text = event.timestamp!.description    }
  • 点击cell的页面
    由于默认的M-D页面模式 点击cell是直接指向D页面,我们把他删掉,写到tableview的didSelectRowAt方法中,使用navigationController并传递当前查询出来的数据对象
    我这里是使用stroyboard ID来获取视窗
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {        //点击cell push        let object = self.fetchedResultsController.object(at: indexPath)        let story = UIStoryboard(name: "Main", bundle: Bundle.main)        let controller = story.instantiateViewController(withIdentifier: "detail") as! DetailViewController        controller.detailItem = object        self.navigationController?.pushViewController(controller, animated: true)    }
  • 更改新增日志按钮的方法
    默认模式是点击新增直接tableview多一行数据,我们这里的需求则是进入新增的编辑页面。
    我们给新增按钮的方法更改一下,push到新页面就可以了
    //插入新记事本    func insertNewObject(_ sender: Any) {        //初始化 插入时间戳 和 空数据        let context = self.fetchedResultsController.managedObjectContext        let newEvent = Event(context: context)        newEvent.timestamp = NSDate()        newEvent.noteDetail = ""        //保存        do {            try context.save()        } catch {            let nserror = error as NSError            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")        }        //push        let story = UIStoryboard(name: "Main", bundle: Bundle.main)        let controller = story.instantiateViewController(withIdentifier: "detail") as! DetailViewController        controller.detailItem = newEvent        self.navigationController?.pushViewController(controller, animated: true)    }
  • 新增刷新tableview
    由于返回机制是由navigationController来控制的,我们需要在D页面返回时刷新一下tableview,重读数据库,让新数据能展现出来
override func viewWillAppear(_ animated: Bool) {        super.viewWillAppear(animated)        //返回时刷新数据        self.tableView.reloadData()    }

Demo地址

https://github.com/gongxiaokai/SimpleNote

0 0
原创粉丝点击