zoukankan      html  css  js  c++  java
  • Runtime实现设置placeholder的文本颜色

    1.基础办法:(在扩展中使用KVC获取属性的值)(先设置文本颜色,后设置placeholder, placeholder颜色无效)

    NS_ASSUME_NONNULL_BEGIN
    
    @interface UITextField (Placeholder)
    @property UIColor *placeholderColor;
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    #import "UITextField+Placeholder.h"
    #import <objc/message.h>
    // 设置占位文字颜色
    //_textField.placeholderColor = [UIColor greenColor];
    // 设置占位文字:每次设置占位文字的后,在拿到之前保存占位文字颜色,重新设置
    // [_textField setHk_Placeholder:@"123"];
    
    @implementation UITextField (Placeholder)
     - (void)setPlaceholderColor:(UIColor *)placeholderColor
     {
     // 设置占位文字颜色
     UILabel *placeholderLabel = [self valueForKey:@"placeholderLabel"];
     placeholderLabel.textColor = placeholderColor;
     }
     
     - (UIColor *)placeholderColor
     {
     return nil;
     }
    @end
    // 基础方法 
    //设置占位文字:每次设置占位文字的后,在拿到之前保存占位文字颜色,重新设置
    // 分析:为什么先设置占位文字颜色,就没有效果 => 占位文字label拿不到

    2.使用Runtime实现

    NS_ASSUME_NONNULL_BEGIN
    
    @interface UITextField (Placeholder)
    @property UIColor *placeholderColor;
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    #import "UITextField+Placeholder.h"
    #import <objc/message.h>
    // 设置占位文字颜色
    //_textField.placeholderColor = [UIColor greenColor];
    // 设置占位文字:每次设置占位文字的后,在拿到之前保存占位文字颜色,重新设置
    // [_textField setHk_Placeholder:@"123"];
    
    @implementation UITextField (Placeholder)
    + (void)load
    {
        // setPlaceholder
        Method setPlaceholderMethod = class_getInstanceMethod(self, @selector(setPlaceholder:));
        Method setHk_PlaceholderMethod = class_getInstanceMethod(self, @selector(setHk_Placeholder:));
        method_exchangeImplementations(setPlaceholderMethod, setHk_PlaceholderMethod);
    }
    - (void)setPlaceholderColor:(UIColor *)placeholderColor
    {
        
        // 给成员属性赋值 runtime给系统的类添加成员属性
        // 添加成员属性
        objc_setAssociatedObject(self, @"placeholderColor", placeholderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        
        // 获取占位文字label控件
        UILabel *placeholderLabel = [self valueForKey:@"placeholderLabel"];
        
        // 设置占位文字颜色
        placeholderLabel.textColor = placeholderColor;
    }
    
    - (UIColor *)placeholderColor
    {
        return objc_getAssociatedObject(self, @"placeholderColor");
    }
    
    // 设置占位文字
    // 设置占位文字颜色
    - (void)setHk_Placeholder:(NSString *)placeholder
    {
        [self setHk_Placeholder:placeholder];
        
        self.placeholderColor = self.placeholderColor;
    }
    
    @end

     

     

     

     

     

  • 相关阅读:
    SqlLite的使用
    asp.net批量上传图片带进度条显示
    对于GridView控件的RowDataBount事件的错误理解
    关于SQL中时间对比
    关于使用触发器时使用@@identity的问题
    关于Treeview控件如何给每个节点加js脚本的方法
    /etc/init.d/functions详解
    如何解决安装DreamWeaver8 时候提示“无法将数值写入键/SOFTWARE/classes/.shtml”
    [请教]关于超大数据量网站的数据搜索和分页的实现方法
    svchost.exe[900]中发生未处理的win32异常
  • 原文地址:https://www.cnblogs.com/StevenHuSir/p/UITextField_Placeholder.html
Copyright © 2011-2022 走看看