接下来,我们将继续完善这个程序,实现在领结间的切换,完成wear和rate按钮事件的处理,以及验证数据的有效性。
转载请注明出处:http://blog.csdn.net/yamingwu/article/details/42244803
源代码地址:https://github.com/dnawym/StudySwift/tree/master/CoreData/Bow%20Ties
添加变量记录当前选中的领结
var currentBowtie: Bowtie!
修改viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
insertSampleData()
let request = NSFetchRequest(entityName: "Bowtie")
let firstTitle = segmentedControl.titleForSegmentAtIndex(0)
request.predicate = NSPredicate(format: "searchKey == %@", firstTitle!)
var error: NSError? = nil
var results = managedContext.executeFetchRequest(request, error: &error) as [Bowtie]?
if let bowties = results {
currentBowtie = bowties[0]
populate(currentBowtie)
} else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}
实现wear操作,每当用户点击wear按钮,增加当前选中领结的穿戴次数并更新最近一次穿戴时间
@IBAction func wear(sender: AnyObject) {
let times = currentBowtie.timesWorn.integerValue
currentBowtie.timesWorn = NSNumber(integer: (times + 1))
currentBowtie.lastWorn = NSDate()
var error: NSError?
if !managedContext.save(&error) {
println("Could not save \(error), \(error!.userInfo)")
}
populate(currentBowtie)
}
添加rate按钮按下事件的处理,当rate被按下,弹出一个alert,供用户填入分数
@IBAction func rate(sender: AnyObject) {
let alert = UIAlertController(title: "New Rating", message: "Rate this bow tie", preferredStyle: UIAlertControllerStyle.Alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: {
(action: UIAlertAction!) in
})
let saveAction = UIAlertAction(title: "Save", style: .Default, handler: {
(action: UIAlertAction!) in
let textField = alert.textFields![0] as UITextField
self.updateRating(textField.text)
})
alert.addTextFieldWithConfigurationHandler{
(textField: UITextField!) in
}
alert.addAction(cancelAction)
alert.addAction(saveAction)
self.presentViewController(alert, animated: true, completion: nil)
}
func updateRating(numericString: String) {
currentBowtie.rating = (numericString as NSString).doubleValue
var error: NSError?
if !managedContext.save(&error) {
println("Could not save \(error), \(error!.userInfo)")
}
populate(currentBowtie)
}
程序执行效果:
检验数据的有效性:
现在,程序有个问题,在打分时,可以填入大于5的分数,这是不合理的。接下来,我们利用Core Data提供的支持来验证数据的有效性。
打开数据模型,选择rating的attribute,如下图设置rating的最大最小和默认值
这个时候,再输入大于5的rate值,console就会显示如下所示的错误信息
接下来,修改updateRating函数,处理这个错误,如果输入过大或者过小,则再次弹出alert,让用户进行输入
func updateRating(numericString: String) {
currentBowtie.rating = (numericString as NSString).doubleValue
var error: NSError?
if !managedContext.save(&error) {
if error!.code == NSValidationNumberTooLargeError ||
error!.code == NSValidationNumberTooSmallError {
rate(currentBowtie)
}
} else {
populate(currentBowtie)
}
}
我们继续完善这个程序,处理segment control,用户点击不同的领结在各个领结间进行切换
@IBAction func segmentedControl(control: UISegmentedControl) {
let selectedValue = control.titleForSegmentAtIndex(control.selectedSegmentIndex)
// segement的标题就是Core Data中的关键字
let fetchRequest = NSFetchRequest(entityName: "Bowtie")
fetchRequest.predicate = NSPredicate(format: "searchKey == %@", selectedValue!)
var error: NSError?
let results = managedContext.executeFetchRequest(fetchRequest, error: &error) as [Bowtie]?
// 因为搜索结果只有唯一的一个,最后一个就是我们需要的搜索结果
if let bowties = results {
currentBowtie = bowties.last!
populate(currentBowtie)
} else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}
至此,我们就完成了第二个实例。在这个例子中我们练习了在第一个实例中学到的fetch和save数据的方法,也学习了新的技术:创建继承于managed object的子类以及使用各种不同类型的Core Data属性并进行数据有效性校验。
通过这两章,大家可能已经初步认识到Core Data的作用和便利性,但是,这仅仅才是开始,我们还有更多要学习的。