Swift教程_CoreData实例(一)_构建storyboard
Swift教程_CoreData实例(二)_构建数据层
Swift教程_CoreData实例(三)_构建控制层(列表数据加载、删除数据)
Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)
Swift教程_CoreData实例(五)_构建控制层(添加数据)
2.查询数据
我们自定义一个列表控制器PKOBookDetailTableViewController,并应用到storyboard的明细显示view中,用来显示所选中的book的明细。通过PKOBooksTableViewController传的Book对象来为列表赋值。
其中用到了监听系统语言变更通知的触发发放,以及coredata自带的undo、redo功能(撤销操作、取消撤销),当然不加这些功能也不影响最终效果,详细见代码与注释。
代码如下,注释非常详细,其中包含更新数据的部分代码,请结合下一小节的代码阅读:
- import UIKit
-
- class PKOBookDetailTableViewController: UITableViewController {
-
- var book: Book!
-
- @IBOutlet weak var titleLabel: UILabel!
- @IBOutlet weak var authorLabel: UILabel!
- @IBOutlet weak var dateLabel: UILabel!
-
-
- override func viewDidLoad() {
- super.viewDidLoad()
- NSLog("==viewDidLoad==")
-
- self.navigationItem.rightBarButtonItem = self.editButtonItem()
-
-
- self.tableView.allowsSelectionDuringEditing = true
-
-
- NSNotificationCenter.defaultCenter().addObserver(self, selector: "localeChanged:", name: NSCurrentLocaleDidChangeNotification, object: nil)
- }
-
-
- deinit{
- NSLog("==deinit==")
- NSNotificationCenter.defaultCenter().removeObserver(self, name: NSCurrentLocaleDidChangeNotification, object: nil)
- }
-
-
-
-
-
- override func canBecomeFirstResponder() -> Bool {
- return true
- }
-
-
- override func viewDidAppear(animated: Bool) {
- super.viewDidAppear(animated)
- self.becomeFirstResponder()
- }
-
-
- override func viewWillDisappear(animated: Bool) {
- super.viewWillDisappear(animated)
- self.resignFirstResponder()
- }
-
-
- override func viewWillAppear(animated: Bool) {
- NSLog("==viewWillAppear==")
- super.viewWillAppear(animated)
-
-
- self.updateInterface()
-
- self.updateRightBarButtonItemState()
- }
-
-
- override func setEditing(editing: Bool, animated: Bool) {
- super.setEditing(editing, animated: animated)
- NSLog("==setEditing==\(editing)")
-
- self.navigationItem.setHidesBackButton(editing, animated: animated)
-
-
- if(editing){
- self.setUpundoManager()
- }else
-
- {
- self.cleanUpUndoManager()
- var error: NSError? = nil
- if (self.book.managedObjectContext?.save(&error) == nil) {
- NSLog("Unresolved error \(error), \(error?.userInfo)")
- abort()
- }
- }
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
-
- }
-
-
- func updateInterface() {
- self.authorLabel.text = self.book.author
- self.titleLabel.text = self.book.title
- self.dateLabel.text = self.dateFormatter().stringFromDate(self.book.theDate)
- }
-
- func updateRightBarButtonItemState() {
- NSLog("==updateRightBarButtonItemState==")
-
- var error: NSError? = nil
- self.navigationItem.rightBarButtonItem?.enabled = self.book.validateForUpdate(&error)
- }
-
-
-
-
-
- override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
- return UITableViewCellEditingStyle.None
- }
-
-
- override func tableView(tableView: UITableView, shouldIndentWhileEditingRowAtIndexPath indexPath: NSIndexPath) -> Bool {
- return false
- }
-
-
- override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
- if(self.editing){
- return indexPath
- }
- return nil
- }
-
-
- override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
- if(self.editing){
- self.performSegueWithIdentifier("DetailToEdit", sender: self)
- }
- }
-
-
-
-
- func setUpundoManager() {
- if self.book.managedObjectContext?.undoManager == nil {
- self.book.managedObjectContext?.undoManager = NSUndoManager()
- self.book.managedObjectContext?.undoManager?.levelsOfUndo = 3
- }
-
- var bookUndoManager = self.book.managedObjectContext?.undoManager
-
-
- NSNotificationCenter.defaultCenter().addObserver(self, selector: "undoManagerDidUndo:", name: NSUndoManagerDidUndoChangeNotification, object: bookUndoManager)
- NSNotificationCenter.defaultCenter().addObserver(self, selector: "undoManagerDidRedo:", name: NSUndoManagerDidRedoChangeNotification, object: bookUndoManager)
- }
-
-
- func cleanUpUndoManager() {
- var bookUndoManager = self.book.managedObjectContext?.undoManager
-
-
- NSNotificationCenter.defaultCenter().removeObserver(self, name: NSUndoManagerWillUndoChangeNotification, object: bookUndoManager)
- NSNotificationCenter.defaultCenter().removeObserver(self, name: NSUndoManagerWillRedoChangeNotification, object: bookUndoManager)
-
-
- self.book.managedObjectContext?.undoManager = nil
- }
-
-
- func undoManagerDidUndo(notification : NSNotification){
- NSLog("==undoManagerDidUndo==")
-
- self.updateInterface()
-
- self.updateRightBarButtonItemState()
- }
-
-
- func undoManagerDidRedo(notification : NSNotification){
- NSLog("==undoManagerDidRedo==")
-
- self.updateInterface()
-
- self.updateRightBarButtonItemState()
- }
-
-
-
-
- func dateFormatter() -> NSDateFormatter{
- var dateFormatter = NSDateFormatter()
- dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
- dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
- return dateFormatter
- }
-
-
-
-
- override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
- if(segue.identifier == "DetailToEdit"){
- var bookEditViewController = segue.destinationViewController as PKOBookEditViewController
-
- bookEditViewController.editedObject = self.book
-
- switch(self.tableView.indexPathForSelectedRow()!.row) {
- case 0:
- bookEditViewController.editedFieldKey = "title"
- bookEditViewController.editedFieldName = "title"
- case 1:
- bookEditViewController.editedFieldKey = "author"
- bookEditViewController.editedFieldName = "author"
- case 2:
- bookEditViewController.editedFieldKey = "theDate"
- bookEditViewController.editedFieldName = "theDate"
- default:
- break
- }
- }
- }
-
-
-
-
- func localeChanged(notification : NSNotification) {
- NSLog("==localeChanged==")
-
- self.updateInterface()
- }
-
- }
3.更新数据
我们自定义一个基本的view控制器PKOBookEditViewController,并应用到storyboard的编辑view中,用来编辑所选中的字段。通过PKOBookDetailTableViewController中所选择的字段为编辑view的字段赋值。
其中用到了日期选择控件,需要根据PKOBookDetailTableViewController选择的字段来判断显示哪种控件。
代码如下,注释非常详细:
- import UIKit
-
- class PKOBookEditViewController: UIViewController {
-
- @IBOutlet weak var textField: UITextField!
- @IBOutlet weak var datePicker: UIDatePicker!
- var editedObject: Book!
- var editedFieldKey: String!
- var editedFieldName: String!
- var editingDate: Bool!{
- get{
-
- var attributeClassName = self.editedObject.entity.attributesByName[self.editedFieldKey]?.attributeValueClassName?
- if attributeClassName == "NSDate" {
- return true
- }
- else {
- return false
- }
- }
- }
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- self.title = self.editedFieldName
-
- if self.editingDate! {
- self.textField.hidden = true
- self.datePicker.hidden = false
-
- var date = self.editedObject.valueForKey(self.editedFieldKey) as? NSDate
- if date == nil {
- date = NSDate()
- }
- self.datePicker.date = date!
- }
- else {
- self.textField.hidden = false
- self.datePicker.hidden = true
- self.textField.text = self.editedObject.valueForKey(self.editedFieldKey) as String
- self.textField.placeholder = self.title
- self.textField.becomeFirstResponder()
- }
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
-
- }
-
-
- @IBAction func saveAction(sender: AnyObject) {
-
- NSLog("==saveAction==\(self.editedFieldName)")
- var undoManager = self.editedObject.managedObjectContext?.undoManager
- undoManager?.setActionName(self.editedFieldName)
-
-
- if self.editingDate! {
- self.editedObject.setValue(self.datePicker.date, forKey:self.editedFieldKey)
- }
- else {
- self.editedObject.setValue(self.textField.text, forKey:self.editedFieldKey)
- }
-
- self.navigationController?.popViewControllerAnimated(true)
- }
-
- }
原文地址:http://blog.csdn.net/ooppookid/article/details/40887317