Xcode 11 Beta-iOS 13模拟器-带有占位符的UITextField导致应用崩溃

时间:2019-06-10 13:02:48

标签: uitextfield placeholder xcode11 ios13

在Xcode 11 Beta版本和iOS 13 Simulator中,访问TextField _placeholderLabel.textColor标签键时发生崩溃。

用于应用占位符文本颜色的键。

[textfield setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
  

“ NSGenericException”-原因:“禁止访问UITextField的_placeholderLabel ivar。这是一个应用程序错误”

16 个答案:

答案 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)

我认为这是XCode方面的错误,希望他们会在下一发行版中修复此错误。您可以通过删除模拟器设备上的所有内容和设置来快速解决此问题。

enter image description here

答案 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

如果您是从情节提要中将其用作运行时变量并出现问题,那么只需删除“ _”

像这样 enter image description here

在删除“ _”运行时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)

用于UISEARCHBAR PLACEHOLDER (颜色)

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)

我在“用户定义的运行时属性”部分中删除了变量“ _placeholderLabel” enter image description here

答案 15 :(得分:0)

删除“_”表单“_placeholderLabel.textColor”尝试使用“placeholderLabel.textColor”。