使用CoreData创建待办事项列表应用程序的简便方法

如果初学者和高级程序员有什么共同点,是我们希望事情简单明了吗? 没有功能或效率的折衷 核心数据是一个非常有用的框架,它使开发人员能够在设备上本地管理数据。 尽管有用且非常强大,但是对于初学者来说,这尤其令人恐惧,尤其是在处理诸如NSManagedObjectNSPredicate 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工作区,我们将从那里开始。

项目设置

  1. 由于我们将以编程方式进行此操作,因此继续并删除 Main.storyboard文件。
  2. 通过删除情节提要文件,我们必须以编程方式设置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 。 设置UITableViewDelegateUITableViewDataSource 。 创建一个名为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()函数内调用该函数。

现在,让我们设置数据模型。

数据模型设置

  1. 在开始实现CoreDataBC之前,我们必须设置数据模型。 您应该有一个名为.xcdatamodelid的文件,该文件通常位于info.plist 。 如果没有,请单击“文件”->“新建”->“文件…”,然后查找一个名为“ Data Model的文件,并为其提供所需的任何名称。
  2. 打开您刚刚添加(或已经拥有)的数据模型,然后单击屏幕底部显示“添加实体”的加号按钮
  3. 将实体重命名为Tasks设置我们需要的属性。 属性是我们试图保存到数据模型中的键。 对于我们的应用程序,我们需要保存task名称和该taskstatus ,无论它是否完成。 都是字符串。 请参考下图:

现在让我们开始实施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

  1. 创建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本身,但这就是重点! 我们将重点放在开发应用程序上,而不是开发它的内部。

您可以访问完整的源代码以用作参考。