Dans la version bêta de Xcode 11 et le simulateur iOS 13, un crash se produit lors de l'accès à la clé d'étiquette TextField _placeholderLabel.textColor.
Clé utilisée pour appliquer la couleur du texte d'espace réservé.
[textfield setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
"NSGenericException" - raison: "L'accès à l'ivar _placeholderLabel d'UITextField est interdit. Il s'agit d'un bogue d'application"
Remplacez simplement _placeholderLabel
avec placeholderLabel
Ajoutez le code suivant au bas du paramètre d'espace réservé:
let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(textField, iVar) as! UILabel
placeholderLabel.textColor = .white
Par exemple:
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .gray
let textField = UITextField()
textField.frame = CGRect(x: 0, y: 100, width: 300, height: 50)
textField.placeholder = "UITextField Demo"
view.addSubview(textField)
let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(textField, iVar) as! UILabel
placeholderLabel.textColor = .white
}
Swift 5
Voici un remplacement correct de Swift de cette propriété. Notez que si vous modifiez également l'alignement d'autres propriétés pour le champ de texte, vous devez également définir ces propriétés sur le texte attribué à l'espace réservé. Généralement, seule la couleur et la police sont modifiées:
/// Set placeholder text color
/// - Parameter color: the color
func setPlaceholderColor(_ color: UIColor) {
// Color
var attributes: [NSAttributedString.Key: Any] = [.foregroundColor: color]
var range = NSRange(location: 0, length: 1)
// Font
if let text = attributedText, text.length > 0, let attrs = attributedText?.attributes(at: 0, effectiveRange: &range), let font = attrs[.font] {
attributes[.font] = font
}
else if let font = font {
attributes[.font] = font
}
self.attributedPlaceholder = NSAttributedString(string: self.placeholder ?? "", attributes: attributes)
}
Xcode 11.1
À partir d'iOS 13, le SDK fournit ISearchBar.searchTextField afin que nous puissions utiliser une API publique au lieu d'une API privée. Dans la sous-classe de UISearchBar j'ai utilisé ce code pour changer la couleur de l'espace réservé
UITextField *textField = [self findSubviewOfClass:[UITextField class]];
textField.textColor = [UIColor whiteColor];
//textField.font = [UIFont fontWithName:@"HelveticaNeue-Regular" size:14.0f];
if (@available(iOS 13.0, *)) {
self.searchTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName: [UIColor colorWithRed:0.8 green:0.82 blue:0.81 alpha:1]}];
}else {
[textField setValue:[UIColor colorWithRed:0.8 green:0.82 blue:0.81 alpha:1] forKeyPath:@"_placeholderLabel.textColor"];
}
Pour IOS 13, vous pouvez définir la couleur de l'espace réservé UITextField par un code de ligne.
Objectif C
[textField setAttributedPlaceholder:[[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]];
Dans Swift 5
txtTitle.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])