您的位置:首页 > 产品设计 > UI/UE

10.使用UITableView制作永久性存储的信息存储

2015-12-21 16:49 369 查看
在前面, 我们讲过用UITabelView存储一些简单的数据, 但并不能永久存储的, 只能作为缓存处理, 现在我们使用一个Apple提供的数据存储工具CoreData来把数据永久性的存储在本地, 当然, 这并不是真的永久保存, 一旦你把应用删掉, 数据也是会不见了的, 好了, 废话少说, 让我们来看看.

1.注意事项

在开始创建工程的时候, 我们需要勾上一个东西:



PS:如果项目一开始没有勾上,可以后期手动在AppDelegate中自行添加对应的代码

2.布局界面



3.配置CoreData文件



4.实现代码

准备代码

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!
var people = [NSManagedObject]()

override func viewDidLoad() {
super.viewDidLoad()

title = "\"The List\""

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
}


实现UITableViewDataSoucre

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return people.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// 1.获取UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

// 2.把people对应的每一行UITableViewCell赋给person
let person = people[indexPath.row]

// 3.把从person里名为"name"的CoreData表里的内容赋给Cell.textLabel!.text
cell.textLabel!.text = person.valueForKey("name") as? String

// 4.返回Cell
return cell
}


绑定UIBarButtonItem的点击事件

@IBAction func addName(sender: UIBarButtonItem) {
// 1.初始化一个UIAlertController, 设置它的内容以及样式
var alert = UIAlertController(title: "Sava", message: "Add a New Name", preferredStyle: .Alert)

// 2.初始化UIAlertAction的参数, 以及点击之后所做的操作.
let saveAtion = UIAlertAction(title: "Save", style: .Default) { (action: UIAlertAction!) -> Void in
// 2.1获取UITextField里的输入内容
let textField = alert.textFields![0] as! UITextField
// 2.2把获取到的UITextField内容传入到saveName的方法里
self.saveName(textField.text)

// 2.3刷新当前的UITableView
self.tableView.reloadData()
}

// 3.初始化UIAlertAction, 但在点击了之后不进行任何操作
let cancelAtion = UIAlertAction(title: "Cancel", style: .Default) { (action: UIAlertAction!) -> Void in
}

// 4.在UIAlertController上添加一个UITextField
alert.addTextFieldWithConfigurationHandler { (textField: UITextField!) -> Void in
}

// 5.在UIAlertController上添加初始化好的UIAlerAtion
alert.addAction(saveAtion) alert.addAction(cancelAtion)

// 6.显示设置好的UIAlertController.
presentViewController(alert, animated: true, completion: nil) }


实现CoreData数据存储

func saveName(name: String) {
// 1.获取appDelegate
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

// 2.获取appDelegate的managedObjectContext
let managedContext = appDelegate.managedObjectContext!

// 3.把找到Person这个xcdatamodeld托管给获取到的managedObjectContext进行数据存储
let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedContext)

let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)

// 4.1把外部传入的内容存储到key为"name"的表中
person.setValue(name, forKey: "name")

// 5.在这里我们需要处理错误信息
var error: NSError?

// 5.1如果存储失败, 就打印错误信息
if !managedContext.save(&error) {
println("Could not save \(error), \(error?.userInfo)")
}

// 6.把内容添加到people数组中
people.append(person)
}


处理细节

// 重写刚加载页面的方法
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)

// 1.获取appDelegate
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

// 2.获取appdelegate的managedObjectContext委托
let managedCountext = appDelegate.managedObjectContext!

// 3.获取CoreData里名为Person里的数据内容
let fetchRequest = NSFetchRequest(entityName: "Person")

// 4.处理错误
var error: NSError?

// 5.把从委托里拿到的Person数据以及错误信息赋给变量fetchedResults
let fetchedResults = managedCountext.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject]

// 6.判断如果成立, 就把内容赋给people, 否则就打印错误信息
if let results = fetchedResults {
people = results
} else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}


4.最终效果



好了, 这次我们就讲到这里, 下次我们继续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息