在Xcode 11 Beta版本和iOS 13 Simulator中,访问TextField _placeholderLabel.textColor标签键时发生崩溃。
用于应用占位符文本颜色的键。
[textfield setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
“ NSGenericException”-原因:“禁止访问UITextField的_placeholderLabel ivar。这是一个应用程序错误”
答案 0 :(得分:5)
我是这样做的:
Objc
NSMutableAttributedString *placeholderAttributedString = [[NSMutableAttributedString alloc] initWithAttributedString:searchField.attributedPlaceholder];
[placeholderAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, [placeholderAttributedString length])];
searchField.attributedPlaceholder = placeholderAttributedString;
雨燕5
var placeholderAttributedString = NSMutableAttributedString(attributedString: searchField.attributedPlaceholder)
placeholderAttributedString.addAttribute(.foregroundColor, value: UIColor.red, range: NSRange(location: 0, length: placeholderAttributedString.length))
searchField.attributedPlaceholder = placeholderAttributedString
有点长,但目前我没有什么好
答案 1 :(得分:4)
答案 2 :(得分:3)
删除下划线“ _”,然后尝试这个。
[textfield setValue:[UIColor whiteColor] forKeyPath:@"placeholderLabel.textColor"];
它应该适用于所有版本!
答案 3 :(得分:2)
“删除所有内容和设置”
这对我有用。
答案 4 :(得分:2)
如果您使用的是UITextView + Placeholder.h类,请在下面的方法中进行更改,如果问题仍然存在,请清理并构建
目标C
+(UIColor *)defaultPlaceholderColor {
static UIColor *color = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
UITextField *textField = [[UITextField alloc] init];
textField.placeholder = @" ";
// color = [textField valueForKeyPath:@"_placeholderLabel.textColor"];
Ivar ivar = class_getInstanceVariable([UITextField class], "_placeholderLabel");
UILabel *placeholderLabel = object_getIvar(textField, ivar);
color = placeholderLabel.textColor;
});
return color;
}
答案 5 :(得分:2)
是的,此问题与Xcode版本有关。我有Xcode 11.2.1,并且遇到相同的问题。
_placeholderLabel.textColor
如果您是从情节提要中将其用作运行时变量并出现问题,那么只需删除“ _”
像这样在删除“ _”运行时Var后开始工作
答案 6 :(得分:1)
您可以使用运行时来做到这一点:
将以下代码添加到占位符设置的底部
{
"include": ["src/**/*"],
"exclude": ["node_modules", "./node_modules", "./node_modules/*"],
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"allowJs": true,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"noImplicitAny": false,
"alwaysStrict": true,
"strictNullChecks": true,
"types": [],
"lib": [],
"experimentalDecorators": true
}
}
在Xcode 11 beta2上,此代码有效,但我不知道GM版本或正式版本。
完整代码:
Ivar ivar = class_getInstanceVariable([UITextField class], "_placeholderLabel");
UILabel *placeholderLabel = object_getIvar(textField, ivar);
placeholderLabel.textColor = [UIColor whiteColor];
答案 7 :(得分:1)
您可以使用UITextField
方法如下设置attributedPlaceholder
占位符文本颜色,字体:
NSString *text = [textField text];
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:text attributes:@{NSForegroundColorAttributeName: [UIColor redColor], NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Medium" size:14.0f]}];
答案 8 :(得分:1)
只需将_placeholderLabel
替换为placeholderLabel
答案 9 :(得分:0)
我有同样的问题...也许我们只需要等待beta 2
答案 10 :(得分:0)
将以下代码添加到占位符设置的底部:
let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(textField, iVar) as! UILabel
placeholderLabel.textColor = .white
例如:
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
}
答案 11 :(得分:0)
快速5
这是该属性的正确Swift替换。 请注意,如果您还更改了文本字段的其他属性的对齐方式,则还需要将这些属性设置为占位符的属性文本。通常只更改颜色和字体:
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
答案 12 :(得分:0)
Xcode 11.1
从iOS 13开始,SDK提供了 UISearchBar.searchTextField ,因此我们可以使用 公共API而不是私有API。在 UISearchBar 的子类中,我使用此代码更改了占位符颜色
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"];
}
答案 13 :(得分:0)
对于IOS 13,您可以通过一行代码设置UITextField占位符颜色。
目标C
[textField setAttributedPlaceholder:[[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]];
在 Swift 5
中txtTitle.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])
答案 14 :(得分:0)
答案 15 :(得分:0)
删除“_”表单“_placeholderLabel.textColor”尝试使用“placeholderLabel.textColor”。