在核心数据中保存 uipickerview 颜色

Posted

技术标签:

【中文标题】在核心数据中保存 uipickerview 颜色【英文标题】:Save uipickerview color in core data 【发布时间】:2015-09-25 13:00:28 【问题描述】:

我知道我想要什么,但我只是在努力以正确的方式实现它。我正在尝试实现一个小应用程序,它允许用户通过提供类别名称、描述来添加类别,然后从 uipickerview 中选择颜色。我已成功将名称、描述保存在核心数据中。我只是在苦苦挣扎如何获取选定的颜色字符串并将其保存在核心数据中。任何帮助将不胜感激。这是我迄今为止的代码:

import UIKit
import CoreData

class NewCategory: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate 

    let categoryColor = ["Red","Yellow","Black","White", "Green", "Blue"]

    // MARK: - Properties
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    // MARK: Outlets
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var descriptionField: UITextView!
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var colorLabel: UILabel!


    // MARK: Actions
    @IBAction func saveBtn(sender: AnyObject) 

        if name.text == "" || name.text.isEmpty || name.text.isEmpty
            var alert = UIAlertController(title: "WARNING !!!", message: "Couldn't add category. Fill all fields.", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)
         else 
            createCategory()        

    

    // MARK: View settings
    override func viewDidLoad() 
        super.viewDidLoad()
        self.pickerView.dataSource = self
        self.pickerView.delegate = self
    

    // Custom functions
    func createCategory() 
        let entity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!)
        let category = Category(entity: entity!, insertIntoManagedObjectContext: context)

            category.name = name.text
            category.descript = descriptionField.text
            category.color = colorLabel
            println(category.name)
            context?.save(nil)
    

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int 
        return 1
    

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return categoryColor.count
    

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 
        return categoryColor[row]
    

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
        if (row == 0) 
            colorLabel.backgroundColor = UIColor.redColor()
        
        else if(row == 1) 
            colorLabel.backgroundColor = UIColor.yellowColor()
        
        else if(row == 2) 
            colorLabel.backgroundColor = UIColor.blackColor()
        
        else if(row == 3) 
            colorLabel.backgroundColor = UIColor.whiteColor()
        
        else if(row == 4) 
            colorLabel.backgroundColor = UIColor.greenColor()
        
        else 
            colorLabel.backgroundColor = UIColor.blueColor()
        
    

【问题讨论】:

【参考方案1】:

您可以通过这种方式获取颜色名称:

let index = pickerView.selectedRowInComponent(0)
let color = categoryColor[index]

例如,您可以像这样在函数中使用它:

func createCategory() 
        let entity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!)
        let category = Category(entity: entity!, insertIntoManagedObjectContext: context)

            category.name = name.text
            category.descript = descriptionField.text

            let index = pickerView.selectedRowInComponent(0)
            let color = categoryColor[index]
            category.color = color // (assuming color is a String)
            println(category.name)
            context?.save(nil)
    

【讨论】:

我要问的是如何将选定的索引传递给 createCategory() 它将如何适应这个 func createCategory() let entity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!) let category = Category(entity: entity!, insertIntoManagedObjectContext: context) 类别.name = name.text category.descript = descriptionField.text category.color = colorLabel println(category.name) context?.save(nil) 好的,但是当我从核心数据中获取标签时,为什么它没有应用到我的标签上?覆盖 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCellWithIdentifier("categoryCell", forIndexPath: indexPath) as! CategoryTableViewCell 让 category = fetchedResultController.objectAtIndexPath(indexPath) as!类别 cell.colorPicked.backgroundColor = category.color 为? UIColor println(cell.colorPicked.description) 返回单元格 这段代码可以工作,问题出在其他地方,可能在其他 tableviews 数据结构或您的数据模型中 我认为问题出在您的category.color as? UIColor。如果 category.color 是一个字符串,则无法按照您的方式将其转换为 UIColor。您需要执行与您在 pickerView didSelectRow 中执行的操作类似的操作。【参考方案2】:

didSelectRow中获取categoryColor的值

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
       let colorString = categoryColor[row] as! String

        // Save the colorString into Core data

    

【讨论】:

如何在这个函数中传递? func createCategory() let entity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!) let category = Category(entity: entity!, insertIntoManagedObjectContext: context) category.name = name.text category.descript = descriptionField.text category .color = colorLabel println(category.name) context?.save(nil) 您可以创建 colorString 作为全局变量,也可以将此字符串作为 func createCategory(colorStr:String) 传递给方法 抱歉,我是 swift 和移动开发的新手。这个函数 func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) let colorString = categoryColor[row] as! String // 将 colorString 保存到核心数据中 是来自苹果的默认值。我不认为我可以访问它,如果我按照您的建议创建一个 func createCategory(colorStr:String),它将如何在 func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) pickColor = 类别颜色 [行]。对不起这个问题 或者你介意在我发布的代码中说明这一点

以上是关于在核心数据中保存 uipickerview 颜色的主要内容,如果未能解决你的问题,请参考以下文章

将从核心数据中获取的数据分配给 UIPickerView

如何在 iPhone 中更改 UIPickerView 的背景颜色

UIPickerView 在 vi​​ewWillAppear if 语句中不会改变颜色

在 UIPickerView 中更改选定行的颜色,滚动时也是如此

在 Swift 中为选定的 UIPickerView 行设置动画背景颜色

如何在iOS 7下更改UIPickerView中文本的颜色?