摘要
- iOS Swift 獲取一個類的所有屬性
- UIAlertController UIAlertAction 設(shè)置字體顏色
實現(xiàn)
蘋果并沒有公開UIAlertAction的一些關(guān)鍵屬性,比如字體顏色,估計蘋果是希望所有運行在iOS上的應(yīng)用都有統(tǒng)一的風(fēng)格尔艇,就像他希望ActionSheet就應(yīng)該是白底藍(lán)字的樣子羡忘。然而只有我們iOS程序員會喊蘋果爸爸,設(shè)計師們可不管那么多案狠,各種五顏六色都會丟過來服傍。
既要用系統(tǒng)的ActionSheet,又要配合設(shè)計圖顏色的話骂铁,那可以嘗試一下給UIAlertAction的私有屬性賦值吹零。
如果直接使用setValue(color, forKey: "key")
的方法對私有屬性賦值,會有crash的風(fēng)險拉庵。
即便你知道了設(shè)置顏色的屬性是_titleTextColor
灿椅,那只能保證在寫這些代碼的時候,當(dāng)時的iOS系統(tǒng)恰好支持讓你這么賦值,不能保證蘋果爸爸以后在系統(tǒng)更新時會不會把這屬性干掉了茫蛹,然后強(qiáng)行setValue就導(dǎo)致閃退了操刀,這鍋背不得。
在setValue之前婴洼,先確認(rèn)下所set的屬性存在骨坑,會保險一些。
順便我們可以擴(kuò)展UIAlertAction柬采,取出它的所有屬性:
extension UIAlertAction {
/// 取屬性列表
static var propertyNames: [String] {
var outCount: UInt32 = 0
guard let ivars = class_copyIvarList(self, &outCount) else {
return []
}
var result = [String]()
let count = Int(outCount)
for i in 0..<count {
guard let pro: Ivar = ivars[i] else {
continue
}
guard let name = String(utf8String: ivar_getName(pro)) else {
continue
}
result.append(name)
}
return result
}
}
測試一下:
dump(UIAlertAction.propertyNames)
發(fā)現(xiàn)了19個屬性:
? 19 elements
- "_title"
- "_titleTextAlignment"
- "_enabled"
- "_checked"
- "_isPreferred"
- "_imageTintColor"
- "_titleTextColor"
- "_style"
- "_handler"
- "_simpleHandler"
- "_image"
- "_shouldDismissHandler"
- "__descriptiveText"
- "_contentViewController"
- "_keyCommandInput"
- "_keyCommandModifierFlags"
- "__representer"
- "__interfaceActionRepresentation"
- "__alertController"
其中的_titleTextColor
是我們需要賦值的目標(biāo)欢唾。
給UIAlertAction添加個方法,用來檢測是否存在某個屬性:
extension UIAlertAction {
/// 是否存在某個屬性
func isPropertyExisted(_ propertyName: String) -> Bool {
for name in self.propertyNames {
if name == propertyName {
return true
}
}
return false
}
}
現(xiàn)在可以賦值對_titleTextColor賦值了粉捻,也寫個方法給外界調(diào)用吧:
extension UIAlertAction {
/// 設(shè)置文字顏色
func setTextColor(_ color: UIColor) {
let key = "_titleTextColor"
guard isPropertyExisted(key) else {
return
}
self.setValue(color, forKey: key)
}
}
應(yīng)用
彈個ActionSheet看看效果吧:
let cameraAction = UIAlertAction(title: "拍攝", style: .default) { (action) in
print("拍攝")
}
let photoAction = UIAlertAction(title: "相冊", style: .default) { (action) in
print("相冊")
}
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
// 設(shè)置顏色
cameraAction.setTextColor(UIColor.darkText)
photoAction.setTextColor(UIColor.darkText)
cancelAction.setTextColor(UIColor.darkText)
let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
sheet.addAction(cameraAction)
sheet.addAction(photoAction)
sheet.addAction(cancelAction)
self.present(sheet, animated: true, completion: nil)
順利把藍(lán)字改成了黑字礁遣。
查看完整項目
GitHub:UIAlertActionExtension