【问题标题】:Whole view blocks after dismissing color picker veiw关闭颜色选择器视图后整个视图被阻止
【发布时间】:2021-02-18 14:28:24
【问题描述】:

我在 UserDefaults 中保存了一些用 colorPickerView 挑选的颜色,以便在 collectionView 中显示它们。

我的 vc 是这样工作的:

  • 您在集合视图中按下一个单元格;
  • 单元格的索引收集在 userdefaults 中;
  • 同时显示colorPickerView;
  • 用户选择一种颜色,选择器关闭,颜色显示在集合视图单元格中;

当我调用方法来关闭 colorPickerView 时,我使用 userDefaults 保存选择的颜色并刷新包含我的颜色的数组(是的,我知道不推荐这样做,但我还没有找到更好的方法来做到这一点然而)和显示它们的集合视图。问题是,在我刷新数组后,我的视图控制器中的所有内容都不再响应我的命令(如果我按下我的集合视图的单元格,它们什么也不做)。

这些是使用用户默认值保存和检索颜色的扩展:

extension UserDefaults {
    func setColor(color: UIColor?, forKey key: String) {
        var colorData: NSData?
        if let color = color {
            do {
                colorData = try NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: false) as NSData?
                set(colorData, forKey: key)
            } catch let error {
                print("error archiving color data", error)
            }
        }
    }

    func colorForKey(key: String) -> UIColor? {
        var color: UIColor? = .white
        if let colorData = data(forKey: key) {
            do{
                    color = try NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)
            } catch let error {
                
                print("error unarchivig color data", error)
            }
        }
        return color
    } 
}

这就是我声明颜色变量的方式:

 //Colors
    var color1 : UIColor? = UserDefaults.standard.colorForKey(key: Ids.Keys.color1Key)
    var color2 : UIColor? = UserDefaults.standard.colorForKey(key: Ids.Keys.color2Key)
    var color3 : UIColor? = UserDefaults.standard.colorForKey(key: Ids.Keys.color3Key)
    var color4 : UIColor? = UserDefaults.standard.colorForKey(key: Ids.Keys.color4Key)
    var colorsArray: [UIColor] = []

这是我每次想要刷新colorsArray时使用的函数:

 func fillColorsArray(){
        color1  = UserDefaults.standard.colorForKey(key: Ids.Keys.color1Key)
        color2  = UserDefaults.standard.colorForKey(key: Ids.Keys.color2Key)
        color3  = UserDefaults.standard.colorForKey(key: Ids.Keys.color3Key)
        color4  = UserDefaults.standard.colorForKey(key: Ids.Keys.color4Key)
        colorsArray = [color1!, color2!, color3!, color4!]
    }

这是我在colorPickerViewControllerDidFinish 中调用的函数:

    func checkAndUpdateColor(viewController: UIColorPickerViewController){
        passedCellIndex = UserDefaults.standard.integer(forKey: Ids.Keys.passedCellIndexKey)//Index of the tapped collection view cell 
        switch passedCellIndex {
        case 0:
            color1 = viewController.selectedColor
            UserDefaults.standard.setColor(color: color1, forKey: Ids.Keys.color1Key)

        break
        case 1:
            color2 = viewController.selectedColor
            UserDefaults.standard.setColor(color: color2, forKey: Ids.Keys.color2Key)

        break
        case 2:
            color3 = viewController.selectedColor
            UserDefaults.standard.setColor(color: color3, forKey: Ids.Keys.color3Key)

        break
        case 3:
            color4 = viewController.selectedColor
            UserDefaults.standard.setColor(color: color4, forKey: Ids.Keys.color4Key)

        break
        default:
            break
        }
        fillColorsArray()
        collectionView.reloadData()
    }

问题是问题是fillColorsArray() function:呼叫后,当拾取器在我的视图中被解雇任何时候。然而,这是我必须在我的收藏视图中显示选择的颜色的唯一方法。如何防止fillColorsArray() 功能挡住我的整个视野​​?

【问题讨论】:

    标签: ios swift userdefaults uicolorpickerviewcontroller


    【解决方案1】:

    我通过从 checkAndUpdateColor() 函数中删除 fillColorsArray() 函数来解决此问题。我把它放在集合视图的 cellForItemAt 的顶部,以便在调用 reloadData 函数时调用它。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2010-10-28
      • 1970-01-01
      • 2011-12-15
      • 2016-07-08
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多