如何从模态 XIB 设置 VC 的背景颜色
Posted
技术标签:
【中文标题】如何从模态 XIB 设置 VC 的背景颜色【英文标题】:How to set the background colour of VC from a modal XIB 【发布时间】:2017-11-20 15:25:59 【问题描述】:在这个应用程序中,我希望允许用户更改主菜单的背景颜色。 在 MenuVC 中,用户将单击标有“选择颜色”的按钮。 'ColorPickerVC' 将从 XIB 文件中以模态方式呈现。
我为此创建了一个@IBAction 并包含以下代码:
@IBAction func colorPickerPressed = (_ sender: Any)
let colorPicker = ColorPickerVC()
colorPicker.modalPresentationStyle = .custom
present(colorPicker, animated: false, completion: nil)
颜色选择器从 XIB 文件模态加载并以网格格式显示 9 种颜色(UIButton)。
当用户点击一种颜色时,ColorPickerVC 的背景会变为该颜色:
@IBAction func tile1(_ sender: Any)
view.backgroundColor = tile1Color.backgroundColor
然后用户点击“确认”按钮,这将关闭视图并返回到 MenuVC:
@IBAction func confirmBtnPressed(_ sender: Any)
dismiss(animated: false, completion: nil)
这就是我正在努力解决的问题: 在“ConfirmBtnPressed”操作期间,我希望 MenuVC 背景颜色也更改为 ColorPickerVC 背景(用户之前选择的颜色)
关于如何实现这一点的任何想法?
谢谢, 斯科特
【问题讨论】:
【参考方案1】:你应该了解委托模式:
首先创建一个定义所需功能的协议:
protocol ColorPickerProtocol: class
func didSelectColor(_ color: UIColor)
使用该协议扩展您的 ViewController 并实现该方法:
class BackgroundColorViewController: UIViewController, ColorPickerProtocol
func didSelectColor(_ color: UIColor)
view.backgroundColor = color
在您的 Xib 中创建一种方法来传递委托并在所需的 buttonPress 上调用 didSelectColor 函数:
class ColorPickerXib
weak var delegate: ColorPickerProtocol?
@IBAction func dismissButtonPressed(_ sender: UIButton)
delegate?.didSelectColor(color)
self.dismiss()
最后在 ViewController 中使用适当的委托实例化 Xib 并显示它:
let colorPicker = ColorPickerXib()
colorPicker.delegate = self
// Show Xib
【讨论】:
delegate
变量应标记为weak
以避免引用循环。
并且您的协议需要仅限于类才能将属性标记为弱:protocol ColorPickerProtocol: class
。
感谢您的解释:)【参考方案2】:
最简单的方法……
当用户选择一种颜色时,将该颜色保存为用户默认值(因此它将保持不变,而不是一种单一的颜色)。
在菜单 VC 的 viewWillAppear
中读取用户默认的颜色。
通常你会为这种事情使用委托协议,但鉴于它只是一种颜色,并且可能需要记住该颜色,用户默认值是更简单的方法(因为你必须在某些地方保存颜色把它也读出来)
【讨论】:
以上是关于如何从模态 XIB 设置 VC 的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式设置 UINavigationbar 的背景颜色?