效果

需求分析

基于官方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

最新文章

  1. 如何去掉Eclipse里面自动追加的一些注释!!!内详
  2. [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发
  3. 记录ConcurrentHashMap的锁分离技术
  4. 使用 HTML5 canvas 绘制精美的图形
  5. [shell基础]——join命令
  6. 第43条:返回零长度的数组或者集合,而不是null
  7. SQLite 入门教程(三)好多约束 Constraints(转)
  8. java Color
  9. AC日记——【模板】字符串哈希 洛谷 3370
  10. 在Eclipse如何实现在xml文件实现代码提示
  11. 第7章 UserInfo端点(UserInfo Endpoint) - IdentityModel 中文文档(v1.0.0)
  12. Java 集合系列之一:JCF集合框架概述
  13. python3 练手实例6 做一个简单日历
  14. C语言程序试题
  15. HDU 6406 Taotao Picks Apples & FJUT3592 做完其他题后才能做的题(线段树)题解
  16. oracle 变量练习
  17. 16S 基础知识、分析工具和分析流程详解
  18. js获取年月日时分秒星期
  19. scala 学习笔记一 列表List
  20. java Long

热门文章

  1. Qt自定义标签按钮
  2. 用php+mysql+ajax实现淘宝客服或阿里旺旺聊天功能 之 前台页面
  3. CenOS http 安装与运行
  4. Java基础——抽象类和接口
  5. 自动适配H5容器(UIViewView/WKWebView),生成长图,防微信进度条
  6. 深入浅出 spring-data-elasticsearch - 基本案例详解(三
  7. 精通JavaScipt第二版笔记——特性、函数和对象
  8. 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射
  9. 微信js-sdk接口的使用及ios深坑
  10. php添加pcntl扩展(Linux)