【问题标题】:How to change View.backgroundColor using Core Data如何使用 Core Data 更改 View.backgroundColor
【发布时间】:2015-07-26 12:58:28
【问题描述】:

我正在尝试使用核心数据更改视图控制器的背景颜色,以便在重新打开应用程序时保存设置。我有一个名为Settings 的实体,其属性为backgroundColor,类型为Bool,如果为true,则视图将显示白色背景,如果false 为黑色。

但据我所知,我正在重新创建多个设置而不是引用一个。 如何在不使用数组的情况下只更改一个设置类? 目前我正在转换为一个数组,但它没有任何意义,并且在打开视图时出现错误。

数组索引超出范围

设置类

class Settings: NSManagedObject {

@NSManaged var backgroundColor: NSNumber

}

视图控制器

更新:

var settingsArray: [Settings]!
var setting: Settings!
var backgroundSetting: Bool = true


override func viewWillAppear(animated: Bool) {
  backgroundSettings()
}

override func viewDidLoad() {
    super.viewDidLoad()
    backgroundSettings()
}

func backgroundSettings() {

    var error: NSError?
    let request = NSFetchRequest(entityName: "Settings")
    self.settingsArray = moc?.executeFetchRequest(request, error: &error) as! [Settings]

    if settingsArray.count == 1 {
        setting = settingsArray[1]
    } else if settingsArray.count <= 0 {
      println("No settings in array")
    }

    if setting != nil {

        if setting.backgroundColor == 1 {
            backgroundSetting = true
        } else if setting.backgroundColor == 0{
            backgroundSetting = false
        }

    }


    if backgroundSetting == true {
        self.view.backgroundColor = UIColor.whiteColor()
    } else if backgroundSetting == false {
        self.view.backgroundColor = UIColor.darkGrayColor()
    }

}

@IBAction func button(sender: AnyObject) {

    if setting != nil {

        if setting.backgroundColor == 1 {
            setting.backgroundColor = 0
        } else {
            setting.backgroundColor = 1
        }

        var error: NSError?
        moc?.save(&error)

    } else {

        println("No settings available")

        var settings = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: moc!) as! Settings

        settings.backgroundColor = 1

        var error: NSError?
        moc?.save(&error)

    }

    backgroundSettings()
}

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    您应该创建一个检查以查看背景颜色的对象是否已经存在,如果存在则编辑该对象而不是创建新对象,如果不创建并保存新对象。

    你可以声明一个可选属性,比如说

    var existingSetting: Setting?
    

    然后在您的初始提取中,尝试分配它

    self.settings = moc?.executeFetchRequest(request, error: &error) as! [Settings]
    
    if let thisSetting = settings?[0] {
    
        existingSetting = thisSetting
    
    }
    
    
    if existingSetting != nil {
    
        // Set your color based on true / false
    } else {
        // perform a default action
    }
    

    然后进入你的行动

    // Set your context
    
    if existingSetting != nil {
    
        //Update this setting object
    
        existingSetting = true or false 
        // Save the context
    } else {
        // Create a new setting
        // Save the context
    }
    

    【讨论】:

    • 对你的例子有点困惑,我不能在操作中使用thisSetting。但是,如果您指的是根据 thisSetting 值更改 bool 类型 backgroundLight 的值,我会在使用 Bool 和 nil 类型的二进制操作数时得到错误
    • 已更新,我的意思是在操作中说existingSetting - 抱歉!
    • 如果在 fetch 中,则在第二个。
    • 出现错误,数组索引超出范围 for if let thisSetting = settings?[0] 在函数中:/
    • 你能发布你更新的代码吗? if let 中的数组中的可选项应该防止这种情况发生。
    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多