返回

UITextView Placeholder的正确打开方式

IOS

在 iOS 中为 UITextView 添加 Placeholder 属性

在 iOS 开发中,UITextView 控件广泛用于输入多行文本。然而,默认情况下,UITextView 不支持 placeholder 属性,这可能导致用户困惑,不知道该输入什么内容。

实现原理

为了弥补这一缺陷,我们可以使用类别(Objective-C 中一种扩展类机制)为 UITextView 添加 placeholder 属性。类别允许我们在不修改原始类的情况下为其添加新方法和属性。

我们采用方法交换技术 (Method Swizzling),将 UITextView 的初始化方法与我们自定义的初始化方法交换。这样,在创建 UITextView 时,就会调用我们的自定义方法,而不是原始初始化方法。

自定义初始化方法

- (instancetype)swizzled_init {
    // 调用原始初始化方法
    instancetype instance = [self swizzled_init];

    // 初始化 placeholderLabel 并将其添加到 UITextView
    self.placeholderLabel = [[UILabel alloc] init];
    self.placeholderLabel.text = self.placeholder;
    self.placeholderLabel.textColor = [UIColor lightGrayColor];
    [self addSubview:self.placeholderLabel];

    // 注册文本变化通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextViewTextDidChangeNotification object:self];

    return instance;
}

文本变化监听器

- (void)textDidChange:(NSNotification *)notification {
    // 当文本发生改变时,根据文本长度显示或隐藏 placeholderLabel
    self.placeholderLabel.hidden = self.text.length > 0;
}

设置和获取 Placeholder

- (void)setPlaceholder:(NSString *)placeholder {
    objc_setAssociatedObject(self, @selector(placeholder), placeholder, OBJC_ASSOCIATION_COPY_NONATOMIC);
    self.placeholderLabel.text = placeholder;
}

- (NSString *)placeholder {
    return objc_getAssociatedObject(self, @selector(placeholder));
}

使用方式

使用 placeholder 属性很简单。在创建 UITextView 时,只需将 placeholder 属性设置为所需的占位符文本即可。

UITextView *textView = [[UITextView alloc] init];
textView.placeholder = @"请输入内容";

总结

本文展示了如何使用类别和方法交换在 UITextView 中添加 placeholder 属性。通过遵循这些步骤,你可以轻松地为 UITextView 添加占位符功能,从而提升用户体验。

常见问题解答

1. 这种方法适用于哪些 iOS 版本?

该方法适用于 iOS 7 及更高版本。

2. 我可以自定义 placeholder 的颜色和字体吗?

是的,你可以通过修改 placeholderLabel 的属性来自定义这些设置。

3. placeholder 会与 UITextView 的文本一起提交吗?

不会,placeholder 只是用于提供视觉提示,不会与文本一起提交。

4. 是否可以同时显示 placeholder 和文本?

不,placeholder 会在文本输入时自动隐藏。

5. 这种方法对 UITextView 的性能有影响吗?

影响很小,但取决于你的 placeholder 文本和 UITextView 的大小。