关闭颜色选择器视图后整个视图被阻止
Whole view blocks after dismissing color picker veiw
我在 UserDefaults 中保存了一些用 colorPickerView
选取的颜色,以便在 collectionView
中显示它们。
我的 vc 是这样工作的:
- 您按下 collection 视图中的一个单元格;
- 单元格的索引收集在 userdefaults 中;
- 同时显示colorPickerView;
- 用户选择一种颜色,选择器关闭,颜色显示在 collection 视图单元格中;
当我调用关闭 colorPickerView
的方法时,我使用 userDefaults 保存选择的颜色,并刷新包含我的颜色的数组(是的,我知道不推荐这样做,但我还没有找到更好的方法)和显示它们的 collection 视图。问题是在我刷新数组后,我的视图控制器中的所有内容都不再响应我的命令(如果我按下 collection 视图的单元格,它们什么也不做)。
这些是使用用户默认值保存和检索颜色的扩展:
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()
函数:调用后,当我认为没有被驳回时,我的视图中什么都没有工作。然而,这是我必须在 collection 视图中显示所选颜色的唯一方法。如何防止 fillColorsArray()
函数挡住我的整个视图?
我通过从 checkAndUpdateColor()
函数中删除 fillColorsArray()
函数来解决这个问题。我将它放在集合视图 cellForItemAt
的顶部,以便在调用 reloadData
函数时调用它。
我在 UserDefaults 中保存了一些用 colorPickerView
选取的颜色,以便在 collectionView
中显示它们。
我的 vc 是这样工作的:
- 您按下 collection 视图中的一个单元格;
- 单元格的索引收集在 userdefaults 中;
- 同时显示colorPickerView;
- 用户选择一种颜色,选择器关闭,颜色显示在 collection 视图单元格中;
当我调用关闭 colorPickerView
的方法时,我使用 userDefaults 保存选择的颜色,并刷新包含我的颜色的数组(是的,我知道不推荐这样做,但我还没有找到更好的方法)和显示它们的 collection 视图。问题是在我刷新数组后,我的视图控制器中的所有内容都不再响应我的命令(如果我按下 collection 视图的单元格,它们什么也不做)。
这些是使用用户默认值保存和检索颜色的扩展:
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()
函数:调用后,当我认为没有被驳回时,我的视图中什么都没有工作。然而,这是我必须在 collection 视图中显示所选颜色的唯一方法。如何防止 fillColorsArray()
函数挡住我的整个视图?
我通过从 checkAndUpdateColor()
函数中删除 fillColorsArray()
函数来解决这个问题。我将它放在集合视图 cellForItemAt
的顶部,以便在调用 reloadData
函数时调用它。