我正在开发一个有两种用户类型的应用程序(管理员,普通用户)。 UITabBar和NavigationBar的颜色根据用户类型而变化。 我如何宣布颜色;
struct Color{
struct NavigationBar{
static let tintColor = UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
static let textColor = UIColor.white
}
我如何打电话;
tabBarController.tabBar.barTintColor = Color.TabBar.tintColor
我可以在我称之为“Color.TabBar”的地方写一个If语句并选择正确的颜色,但我想知道如果我能用enum做到这一点。如下面的代码;
struct Color{
struct NavigationBar{
enum tintColor{
case admin
case user
var color: UIColor{
switch self {
case .admin:
return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
case .user:
return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
default:
return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
}
}
}
//static let tintColor = UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
static let textColor = UIColor.white
}
我发现下面的文章,但我认为这与我的问题无关。所以我的问题是我怎么能写那种枚举?
答案 0 :(得分:2)
您实施的方式是正确的,但您需要将用户类型保持为全局。
这就是它需要做的事情;
enum tintColor{
case admin
case user
var tabbarColor: UIColor{
switch self {
case .admin:
return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
case .user:
return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
default:
return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
}
}
}
static var user = tintColor.user
user.tabbarColor // this returns .user color
答案 1 :(得分:1)
我相信你想要的是不可能的。枚举可能不是一个类,只是一个泛型,一个结构。
但它通常不是你想要的,因为当你拥有许多这些价值时,无论如何都会让你感到一团糟。例如,在某些时候,您将拥有按钮背景颜色,边框颜色和文本颜色。那么你期望你的结果如下:
button.backgroundColor = UIButton.backgroundColor
button.layer.borderColor = UIButton.borderColor.cgColor
button.label.textColor = UIButton.textColor
现在有3个枚举单个组件......这是一个解决方案,但我认为这是一个糟糕的...
我建议你创建一个静态类,并且如此:
class UserApperance {
static var userType: UserType = .admin
static var navigationTintColor: UIColor {
switch userType {
case .admin: ...
case .user: ...
}
}
}
所以你在代码中所做的就是再次
tabBarController.tabBar.barTintColor = UserApperance.navigationTintColor
当你想对它们进行分组时,你可以使用嵌套:
class UserApperance {
static var userType: UserType = .admin
class NavigationBar {
static var tintColor: UIColor {
switch UserApperance.userType {
case .admin: ...
case .user: ...
}
}
}
}
现在结果更好:
tabBarController.tabBar.barTintColor = UserApperance.NavigationBar.tintColor
在我看来,这是最好的方式,在白色标签应用程序等非常困难的情况下,您可以真正使用嵌套并按屏幕进行操作,甚至可以使用以下代码:
let appearance = UserAppearance.thisScreenName
titleLabel.textColor = appearance.title.textColor
titleLabel.font = appearance.title.font
提到你可以概括一些事情,甚至可以用作
UserAppearance.thisScreenName.title.configure(label: titleLabel)
可以设置UI元素的所有属性......
但是,如果你真的非常想要拥有它,你仍然可以使用字符串作为颜色或几乎任何原始...
您可以创建
等扩展程序extension UIView {
var backgroundColorString: String? {
set {
self.backgroundColor = UIColor(hexString: newValue)
}
get {
return self.backgroundColor.toHexString()
}
}
}
然后你显然使用这个属性直接从枚举设置颜色。但我不鼓励你这样做。
答案 2 :(得分:1)
好的,所以你有数百万的方法处理这个问题,但请记住你有三个要素:
用户角色变量。当然不仅与UI有关,因此定义在enum UserRole { case user, admin }
之类的地方。我们假设您在某处检索此信息,并在视图控制器中注入此变量。
将此用户角色转换为样式的方法。例如,通过使用一些静态函数:
struct Styles {
struct NavigationBar {
static func barColor(from userRole:UserRole) -> UIColor {
switch userRole {
case .user: return UIColor.blue
case .admin: return UIColor.blue
}
}
static barFont(from userRole:UserRole) -> UIFont {
//... do the swith thing again
}
}
}
另一个但相关的方法是,如果你开始有更多样式,你也可以从userRole变量创建一个struct实例。
struct Styles {
struct NavigationBar {
let color:UIColor
let font:UIFont
init(userRole:UserRole) {
switch userRole {
case .admin:
color = .red
font = UIFont.systemFont(ofSize: 10)
case .user:
color = .blue
font = UIFont.systemFont(ofSize: 16)
}
}
}
}
最后,从你的控制器,只需调用适当的方法来检索样式。这是一个使用简单依赖注入的例子:
let userRole:UserRole
init(userRole:UserRole) {
self.userRole = userRole
super.init()
}
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) is not implemented") }
override func viewDidload() {
super.viewDidLoad()
tabBarController.tabBar.barTintColor = Styles.NavigationBar.barColor(from: userRole)
}