iOS Swift教程 Core Data (二)ManagedObject subclass 下

接下来,我们将继续完善这个程序,实现在领结间的切换,完成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的作用和便利性,但是,这仅仅才是开始,我们还有更多要学习的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值