前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >swift3.0 coreData的使用-日记本demo效果需求分析创建工程添加数据库改写Detail页面改写Master页面Demo地址

swift3.0 coreData的使用-日记本demo效果需求分析创建工程添加数据库改写Detail页面改写Master页面Demo地址

作者头像
gwk_iOS
发布2018-08-23 10:59:49
6080
发布2018-08-23 10:59:49
举报
文章被收录于专栏:coding...coding...

写在前面 弄了下个人站...防止内容再次被锁定...所有东西都在这里面 welcome~ 个人博客

效果

效果.gif

需求分析

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

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

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

创建工程

选择 M-D模式

M-D.png

使用swift和coredata

选择语言和coredata.png

添加数据库

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

添加字段.png

改写Detail页面

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

代码语言:javascript
复制
    //当前entity
    var detailItem: Event? {
        didSet {
            // Update the view.
            self.configureView()
        }
    }
代码语言:javascript
复制
//删除
    @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)

    }
代码语言:javascript
复制
//保存数据
    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)
    }
代码语言:javascript
复制
    //保存数据
    func saveData(context:NSManagedObjectContext) {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }

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

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

改写Master页面

代码语言:javascript
复制
- 更改cell展示内容
- 点击cell的页面
- 更改新增日志按钮的方法
- 新增刷新tableview
  • 更改cell展示内容 cell没有太多要更改的 只是显示样式更改下就行
代码语言:javascript
复制
    //配置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来获取视窗
代码语言:javascript
复制
    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到新页面就可以了
代码语言:javascript
复制
    //插入新记事本
    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,重读数据库,让新数据能展现出来
代码语言:javascript
复制
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        //返回时刷新数据
        self.tableView.reloadData()
    }

Demo地址

https://github.com/gongxiaokai/SimpleNote

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.12.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 效果
  • 需求分析
  • 创建工程
  • 添加数据库
  • 改写Detail页面
  • 改写Master页面
  • Demo地址
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档