web-dev-qa-db-ja.com

Xcode 11 Beta-iOS 13 Simulator-アプリクラッシュが発生するプレースホルダーを含むUITextField

Xcode 11 BetaバージョンおよびiOS 13 Simulatorでは、TextField _placeholderLabel.textColorラベルキーにアクセスするとクラッシュします。

プレースホルダーテキストの色を適用するために使用されるキー。

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

"NSGenericException"-理由: "UITextFieldの_placeholderLabel ivarへのアクセスは禁止されています。これはアプリケーションのバグです"

21
PrasathBabu

_placeholderLabelplaceholderLabel

0
Ar No

-Swiftバージョン

プレースホルダー設定の下部に次のコードを追加します。

    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
}
0

Swift 5

これは正しいSwiftプロパティの置き換えです。テキストフィールドの他のプロパティの配置も変更する場合は、これらのプロパティをプレースホルダの属性付きテキストにも設定する必要があります。通常はカラーのみです。とフォントが変更されました:

/// 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)
}
0

ISEARCHBARプレースホルダーの場合

Xcode 11.1

IOS 13以降、SDKはISearchBar.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"];

}
0
Anuraj

IOS 13の場合、UITextFieldプレースホルダーの色を1行のコードで設定できます。

目的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])