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


    效果

    效果.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

  • 相关阅读:
    单点登录原理与简单实现
    关系型数据库中的关键字、主关键字和候选关键字
    无向图的顶点连通度
    memcmp()直接比较两个数组的大小
    静态字典树
    动态字典树
    poj 1149
    poj 2112 floyd+Dinic最大流+二分最小值
    POJ 1698 (二分图的多重匹配)
    网络流算法
  • 原文地址:https://www.cnblogs.com/gongxiaokai/p/7123826.html
Copyright © 2020-2023  润新知