使用CoreData创建待办事项列表应用程序的简便方法
如果初学者和高级程序员有什么共同点,是我们希望事情简单明了吗? 没有功能或效率的折衷 核心数据是一个非常有用的框架,它使开发人员能够在设备上本地管理数据。 尽管有用且非常强大,但是对于初学者来说,这尤其令人恐惧,尤其是在处理诸如NSManagedObject
和NSPredicate
NSManagedObject
对象时。 当我们只想管理数据时,对于经验丰富的开发人员来说也可能会很费力。 CoreDataBC解决了这个问题; 基于核心数据构建的高级框架。 它可以解决您必须解决的大多数麻烦,并使开发人员更轻松地交互和管理其数据模型。
这就是框架的简单性。
// 保存数据
self.coreData.pushSingleValue([“ ”:])
//检索数据
self.coreData.retrieveData()
//获取数据
let coreDataRecords = self.coreData.getData()//返回NSManagedObject的数组
//更新数据
如果让recordToUpdate = coreDataRecords.first {
self.coreData.update(recordToUpdate,[“ ”:]
}
如果您想要有关该框架的更多信息,请参阅GitHub文档。
在本教程中,我将演示如何使用CoreDataBC创建一个简单的待办事项列表 应用程序 。 没什么复杂的,只是一个简单的UITableView将显示一些数据,一个添加到列表中的按钮以及滑动操作以将其标记为已完成和删除。
先决条件
您应该至少在UITableViews中具有一些背景知识,并已安装CocoaPods。 如果您尚未安装CocoaPods,请参阅CocoaPods安装指南。 如果您正在阅读本文,那么我假设您已经对UIKit框架以及Swift有了很好的理解。
最后说明:一切都会以编程方式完成,只是增加了挑战。
项目设置和安装
创建一个新的Single View Xcode项目,并选中“ Use Core Data
并打开终端。 暂时关闭Xcode项目,并在终端中将CD插入Xcode项目目录并初始化pod。
荚初始化
这样,您的项目目录中将有一个名为Podfile的新文件。 在文本编辑器中打开文件,然后在其下方显示“#Pod # Pods for
添加CoreDataBC pod。
pod'CoreDataBC'
保存Podfile并继续运行pod install
吊舱安装
这样做之后,它应该将CoreDataBC安装到您的Xcode项目中,并且应该已经创建了一个扩展名为.xcworkspace
的新Xcode工作区。 继续并打开新的Xcode工作区,我们将从那里开始。
项目设置
- 由于我们将以编程方式进行此操作,因此继续并删除 Main.storyboard文件。
- 通过删除情节提要文件,我们必须以编程方式设置
RootViewController
并在AppDelegate.swift
文件中执行此操作。 在didFinishingLaunchingWithOptions
函数内执行以下操作。
self.window = UIWindow(框架:UIScreen.main.bounds)
让根= ViewController()
让导航= UINavigationController()
navigation.viewControllers = [root]
self.window?.rootViewController =导航
self.window?.makeKeyAndVisible()
3.转到您的主项目设置,在“ Deployment Info
,有一个“ Main Interface
下拉菜单,请确保该字段为空白。
4.在ViewController.swift
,声明一个名为myTableView
的全局变量,并将其声明为UITableView
。 设置UITableViewDelegate
和UITableViewDataSource
。 创建一个名为setupTableView()
的函数,在其中设置TableView。 在该函数中,继续按照以下步骤初始化和设置TableView:
私人功能setupTableView(){
让navHeight = UIApplication.shared.statusBarFrame.height
让viewWidth = self.view.frame.size.width
让viewHeight = self.view.frame.size.height
self.myTableView = UITableView(框架:CGRect(x:0,y:navHeight,宽度:viewWidth,height:viewHeight-navHeight),样式:.plain)
self.myTableView.register(UITableViewCell.self,forCellReuseIdentifier:“ cell”)
self.myTableView.backgroundColor = UIColor.white
self.myTableView.delegate =自我
self.myTableView.dataSource =自我
self.view.addSubview(self.myTableView)
}
5.在viewDidLoad()
内部调用setupTableView()
函数。
6.初始化您的TableView协议。 现在,您的代码应如下所示:
导入UIKit
ViewController类:UIViewController,UITableViewDelegate,UITableViewDataSource {
私人var myTableView:UITableView!
覆盖func viewDidLoad(){
super.viewDidLoad()
self.setupTableView()
}
私人功能setupTableView
(){
让navHeight = UIApplication.shared.statusBarFrame.height
让viewWidth = self.view.frame.size.width
让viewHeight = self.view.frame.size.height
self.myTableView = UITableView(frame:CGRect(x:0,y:navHeight,width:viewWidth,height:viewHeight — navHeight),样式:.plain)
self.myTableView.register(UITableViewCell.self,forCellReuseIdentifier:“单元格”)
self.myTableView.backgroundColor = UIColor.white
self.myTableView.delegate =自我
self.myTableView.dataSource =自我
self.view.addSubview(self.myTableView)
}
func numberOfSections(在tableView中:UITableView)-> Int {
返回1
}
func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {
返回1
}
func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {
让单元格= UITableViewCell(样式:.subtitle,reuseIdentifier:“单元格”)
返回单元
}
}
5.接下来,我们要在NavigationBar的右侧添加一个UIBarButtonItem。 为此,我们创建一个名为addButton()
的函数。
6.在addButton()
函数中,我们创建UIBarButtonItem。
let button = UIBarButtonItem(barButtonSystemItem:.add,target:self,action:#selector(ViewController.addTask))
self.navigationItem.rightBarButtonItem =按钮
您应该在指向#selector()的地方出现错误,因为我们没有一个名为addTask()
的函数。 您可以继续使用@objc方法创建一个函数来消除该错误。 之后,在setupTableView()
函数内调用该函数。
现在,让我们设置数据模型。
数据模型设置
- 在开始实现
CoreDataBC
之前,我们必须设置数据模型。 您应该有一个名为.xcdatamodelid
的文件,该文件通常位于info.plist
。 如果没有,请单击“文件”->“新建”->“文件…”,然后查找一个名为“Data Model
的文件,并为其提供所需的任何名称。 - 打开您刚刚添加(或已经拥有)的数据模型,然后单击屏幕底部显示“添加实体”的加号按钮
- 将实体重命名为
Tasks
设置我们需要的属性。 属性是我们试图保存到数据模型中的键。 对于我们的应用程序,我们需要保存task
名称和该task
的status
,无论它是否完成。 都是字符串。 请参考下图:
现在让我们开始实施CoreDataBC
CoreDataBC实施
1.导入CoreDataBC
模块,然后创建CoreDataBC
的实例。 CoreDataBC的实例需要两个参数,实体名称和数据模型名称。 实体是从上面的步骤2中的图像获得的名称。数据模型是xcdatamodelid的名称。
// Tasks是实体名称,ToDoList是xcDataModelID名称
专用let coreData = CoreDataBC(“ Tasks”,“ TLD”)
2.我们要做的第一件事是检索我们可能拥有的任何数据。 在viewDidLoad()
内部。 为此,调用retrieveData()
然后重新加载TableView。
//检索数据,无论是否有数据
self.coreData.retrieveData()
//重新加载我们的TableView
self.myTableView.reloadData(
3. TableView中的单元格数量将取决于我们检索到的元素数量。 在numberOfRowsInSection
函数内部,我们将返回已检索到的元素数,而不是返回1个单元格。 为此,我们使用getData()
函数,该函数返回NSManagedObject
的数组
func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {
//获取元素数以设置单元格数
返回self.coreData.getData()。count
}
保存数据
为了保存数据,我们将为用户提供一个AlertController以及一个TextField来键入任务。 为此,我们将创建一个名为addTask()
的函数。 在此函数内,使用一个textField创建一个警报控制器。
要创建警报控制器,我们需要做四件事。
- 创建AlertController
- 将文本字段添加到AlertController
- 创建动作
- 将动作添加到您的AlertController中
- 显示AlertController
创建AlertController
- 创建AlertController
let ac = UIAlertController(title:“添加任务”,消息:无,preferredStyle:.alert)
2.将文本字段添加到AlertController
ac.addTextField {(textField)在
textField.placeholder =“任务”
}
3.创建动作。 在这种情况下,我们需要2个动作; 我们需要保存操作和取消操作。 首先,让我们创建取消动作。
让cancel = UIAlertAction(标题:“取消”,样式:.cancel,处理程序:nil)
现在保存操作。 这次,我们将继续创建一个块,而不是将处理程序设置为nil。
let save = UIAlertAction(title:“ Save”,style:.default){(_)in
}
在块内,我们要访问用户从警报控制器textField中键入的任务。 然后,我们将该值推入其各自的属性,然后重新加载TableView
//获取任务
让任务= ac.textFields![0] .text!
//将task属性设置为task变量
//将status属性设置为空白字符串以指示它不完整
self.coreData.pushSingleValue([“” task“:任务,” status“:”“])
//重新加载TableView
self.myTableView.reloadData()
我们创建了一个带有task
属性的字典,并将其设置为任务变量,状态属性设置为空字符串。 这是因为直到用户完成该任务之前,我们还没有状态。 那就是我们开始更新记录的时间。
3.将动作添加到我们的警报控制器
ac.addAction(保存)
ac.addAction(取消)
4.然后,我们继续提出警报。
self.present(ac,动画:true,完成:无)
您的addTask()
函数应如下所示
@objc func addTask(){
let ac = UIAlertController(标题:“添加任务”,消息:“”,preferredStyle:.alert)
ac.addTextField {(textField)在
textField.placeholder =“任务”
}
let save = UIAlertAction(title:“ Save”,style:.default){(_)in
//从textField获取任务
让任务= ac.textFields![0] .text!
self.coreData.pushSingleValue([“” task“:任务,” status“:”“])
//重新加载我们的TableView
self.myTableView.reloadTableView()
}
让cancel = UIAlertAction(标题:“取消”,样式:.cancel,处理程序:nil)
ac.addAction(保存)
ac.addAction(取消)
self.present(ac,动画:true,完成:无)
}
如果您现在运行代码,则应该可以添加数据,但看不到任何内容。
显示数据
1.在cellForRowAt
函数内部,我们需要使用getData()
函数为每个元素建立索引。
让任务= self.coreData.getData()[indexPath.row]
由于getData()
函数返回一个NSManagedObject数组,因此我们应该能够使用indexPath
对其进行索引
2.现在,我们要按任务的键来解析每个任务的值。 我们要显示两件事,任务及其状态。
cell.textLabel?.text = task.value(forKey:“ task”)as? 串
cell.detailedTextLabel?.text = task.value(forKey:“ status”)as? 串
您的代码应如下所示
func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {
让单元格= UITableViewCell(样式:.subtitle,reuseIdentifier:“单元格”)
让任务= self.coreData.getData()[indexPath.row]
cell.textLabel?.text = task.value(forKey:“ task”)as? 串
cell.detailTextLabel?.text = task.value(forKey:“ status”)为? 串
返回单元
}
现在,当您添加数据时,您应该能够看到任务。
删除资料
我们将使用SwipeAction执行此操作。 我们将向左滑动以删除并向右滑动以声明任务已完成。 但是首先让我们研究删除功能。
1.调用trailingSwipeActionsConfigurationForRowAt
函数,该函数将允许我们在单元格的右侧添加动作。
func tableView(_ tableView:UITableView,TrailingSwipeActionsConfigurationForRowAt indexPath:IndexPath)-> UISwipeActionsConfiguration? {
}
2.注意,该函数正在寻找UISwipeActionsConfiguration
的返回类型。 实际上,我们必须将操作创建为UIContextualAction
然后将其转换为UISwipeActionsConfiguration
。 我不确定为什么会这样,但是那是如何做到的。
让delete = UIContextualAction(style:.normal,title:“ Delete”){(_,_,_)在
}
3. delete
变量是我们的操作。 要将其转换为UISwipeActionConfiguration
,请执行以下操作:
返回UISwipeActionsConfiguration(操作:[删除])
4.哦,让我们将删除操作的背景颜色更改为红色。
delete.backgroundColor = UIColor.red
现在,在我们的删除动作完成块中,我们在这里执行删除功能。 对我们来说幸运的是,我们可以访问indexPath
,当我们为数据建立索引时我们将利用它。
首先,我们使用getData()
函数抓取特定任务并将其编入索引,因为它返回一个NSManagedObject
数组并将其传递给delete
函数,然后重新加载TableView。
//将数据作为NSManagedObject获取
让任务= self.coreData.getData()[indexPath.row]
//删除任务
self.coreData.delete(任务)
//重新加载TableView
self.myTableView.reloadData()
您的代码应如下所示:
func tableView(_ tableView:UITableView,TrailingSwipeActionsConfigurationForRowAt indexPath:IndexPath)-> UISwipeActionsConfiguration? {
let delete = UIContextualAction(style:.normal,title:“ Delete”){(动作,视图,(布尔)->无效)
让任务= self.vc.getData(indexPath.row)
self.coreData.delete(任务)
self.reloadTableView()
}
delete.backgroundColor = UIColor.red
返回UISwipeActionsConfiguration(操作:[删除])
}
现在,您应该可以滑动删除任务了。
更新资料
这是我们将任务标记为完成的地方。 为此,我们将创建另一个滑动动作,但是这次我们将向左滑动。 我们在leadingSwipeActionConfigurationForRowAt
函数中执行此leadingSwipeActionConfigurationForRowAt
。
这看起来与我们上面的删除操作非常相似,因此我将跳过设置过程,并介绍如何将任务的状态从nil更新为Done。
您的代码应如下所示
func tableView(_ tableView:UITableView,LeadingSwipeActionsConfigurationForRowAt indexPath:IndexPath)-> UISwipeActionsConfiguration? {
让完成= UIContextualAction(style:.normal,title:“ Done”){(_,_,_)在
}
done.backgroundColor = UIColor.green
返回UISwipeActionsConfiguration(操作:[完成])
}
在完成动作完成块内,我们希望使用getData()
函数为任务建立索引,并使用update()
函数对其进行update()
。
//获取要更新的任务
让任务= self.coreData.getData()[indexPath.row]
//将任务作为更新内容的参考,并将status属性设置为Done作为我们的新值
self.coreData.update(task,newValues:[“ status”:“ Done”])
//重新加载我们的TableView
self.myTableView.reloadData()
您的代码应如下所示
func tableView(_ tableView:UITableView,LeadingSwipeActionsConfigurationForRowAt indexPath:IndexPath)-> UISwipeActionsConfiguration? {
让完成= UIContextualAction(style:.normal,title:“ Done”){(_,_,_)在
让任务= self.coreData.getData()[indexPath.row]
self.coreData.update(task,newValues:[“ status”:“ Done”])
self.myTableView.reloadData()
}
done.backgroundColor = UIColor.green
返回UISwipeActionsConfiguration(操作:[完成])
}
现在您应该可以将任务标记为已完成!
结论
那是一个很长的教程,并且主要是关于设置项目而不是使用CoreDataBC本身,但这就是重点! 我们将重点放在开发应用程序上,而不是开发它的内部。
您可以访问完整的源代码以用作参考。