效果

需求分析

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

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

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

创建工程

选择 M-D模式



使用swift和coredata

添加数据库

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

改写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

swift3.0 coreData的使用-日记本demo的更多相关文章

  1. swift3.0 coredata 的使用

    //swift3.0在语法上有很大的改变,以简单的增删改查为例,如下: //User类如下: import Foundation import CoreData extension User { @n ...

  2. swift3.0:CoreData的使用

    一.介绍 CoreData不像slqite3那样编写代码繁琐,同时避免了使用了SQL语句的麻烦,也可以回避使用C语言的语法,降低了iOS开发的技术门槛. CoreData可降低开发成本,提高代码质量. ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. IOS CoreData 多表查询demo解析

    在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...

  5. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  6. iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

    今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装.本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UIColle ...

  7. swift3.0 CoreGraphics绘图-实现画板

    swift3.0对绘图的API进行了优化,看起来更swift了. 看下UI的构造.设置画笔粗细.清空面板和保存到本地 下面直接看画板文件 这里我做的比较复杂,记录触摸到的每个点,再连成路径,其实直接用 ...

  8. swift3.0 自定义键盘

    ...绕了一大圈,又绕回原生来了,今天,学习一下swift3.0语法下的自定义键盘.效果图如下: 其实,很简单,只需要把UITextView(或者UITextField)的inputView属性设置为 ...

  9. swift3.0调用相册

    swift3.0调用相册首先需要注意: 1.swift3.0中调用相机和相册会导致崩溃 1.需要在info.plist文件中加入两个键值对,如下: /// 都是String类型,内容任意的字符串即可 ...

随机推荐

  1. Unexpected end of input 和 Unexpected token var 和 Unexpected token ;

    在写jsp的时候使用的一段代码一直调试,出现Unexpected token ; 错误. 所以最后把代码各种精简,得到了如下的测试示例代码 <% String aaa="123&quo ...

  2. pod出现include of non-modular header inside framework module 错误

    今天打包pod 的时候 出现的错误 -> AFNetworking+RX (3.1.0.18) - ERROR | [iOS] xcodebuild: Returned an unsuccess ...

  3. 用excel公式生成有规律的代码,减少编程工作量

    1.在excel中如何输入公式 在excel表格中输入 & 符号是字符串的连接符,比如: 在excel表格中输入  ="sherlock"&"mina&q ...

  4. 工作流调度引擎---Oozie

    Oozie使用教程 一.   Oozie简介 Apache Oozie是用于Hadoop平台的一种工作流调度引擎. 作用 - 统一调度hadoop系统中常见的mr任务启动hdfs操作.shell调度. ...

  5. [0] 领域模型 VS 贫血模型

    贫血→结构体领域→封装方法的类 1.领域模型 也要能够 到达解耦,最好不要出现billdao.InsertBill(obj)这种2.领域方法 最好是自身的方法,如改变一个属性值,添加一个子集,而不是一 ...

  6. js 动态 key value

    问题描述: 如果var mykey = 'a'; 我们试图 a = {mykey: 'b'} 来达到 a = { 'a': 'b'}的效果,但是mykey直接被作为键值,无法达到要求 解决办法: a ...

  7. 集成python双版本详解

    最近要准备学习Python,由于版本上的差异,不知道要学哪个,现在好多东西都是基于python2基础的,但是python2在2020年左右就可能停止了,所以干脆决定两个都装上吧!   首先上官网上下载 ...

  8. react-native 学习 ----- React Navigation

    很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后 ...

  9. Vuejs技术栈从CLI到打包上线实战全解析

    前言 本文是自己vue项目实践中的一些总结,针对Vue2及相关技术栈,实践中版本为2.3.3. 开发前须知 vue-cli 在开发前,我们要至少通读一遍vue官方文档和API(看官方文档是最重要的,胜 ...

  10. Redis的安装与使用(单节点)

    IP:192.168.4.111 环境:CentOS 6.6 Redis版本:redis-3.0 (考虑到Redis3.0在集群和性能提升方面的特性,rc版为正式版的候选版,而且很快就出正式版) 安装 ...