欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS应用开发中使UITextField实现placeholder属性的方法

程序员文章站 2023-12-10 21:37:34
我们都知道ios开发中的uitextfield有个placeholder属性,placeholder可以很方便引导用户输入。但是uitextview却没有placehold...

我们都知道ios开发中的uitextfield有个placeholder属性,placeholder可以很方便引导用户输入。但是uitextview却没有placeholder属性。

一、猥琐的方法

如何让uitextview也有placeholder功能呢?今天给各位分享一个比较猥琐的做法。思路大概是这样的:

  • 把uitextview的text当placeholder使用。
  • 在开始编辑的代理方法里清除placeholder。
  • 在结束编辑的代理方法里在设置placeholder。

实现方法:

1.创建uitextview:

复制代码 代码如下:

uitextview *textviewplaceholder = [[uitextview alloc] initwithframe:cgrectmake(20, 70, screen.width - 40, 100)];
textviewplaceholder.backgroundcolor = [uicolor whitecolor];
textviewplaceholder.text = @"jb51.net";
textviewplaceholder.textcolor = [uicolor graycolor];
textviewplaceholder.delegate = self;
[self.view addsubview:textviewplaceholder];

初始化uitextview,给uitextview的text赋值,并且给uitextview的textcolor属性设置成灰色,让其看起来更像placeholder。

别忘了设置uitextview的代理,因为后面我们要用到uitextview的两个代理方法。

2.开始编辑的代理方法:

复制代码 代码如下:

- (void)textviewdidbeginediting:(uitextview *)textview {

    if ([textview.text isequaltostring:@"jb51.net"]) {
        textview.text = @"";
        textview.textcolor = [uicolor blackcolor];
    }
}


在开始编辑的代理方法里面,判断如果是uitextview的text的值是placeholder,那么,就清空text,并且把textcolor设置成真正的内容颜色,假设是黑色。

3.结束编辑的代理方法:

复制代码 代码如下:

- (void)textviewdidendediting:(uitextview *)textview {
    if (textview.text.length<1) {
        textview.text = @"jb51.net";
        textview.textcolor = [uicolor graycolor];
    }
}

在结束编辑的代理方法里,判断如果uitextview的text值为空,那么,就要把需要设置的placeholder赋值给uitextview的text,并且将textcolor属性设置成灰色。

4.添加轻击手势

复制代码 代码如下:

uitapgesturerecognizer *tapgesture = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(tapgesture:)];
tapgesture.numberoftapsrequired = 1; //点击次数
tapgesture.numberoftouchesrequired = 1; //点击手指数
[self.view addgesturerecognizer:tapgesture];

//轻击手势触发方法
-(void)tapgesture:(uitapgesturerecognizer *)sender
{
    [self.view endediting:yes];
}


至此,就很猥琐的实现了placeholder功能。为了方便测试,我加了一个手势。作用是用键盘消失,这样可以测试结束编辑的时候placeholder会不会显示。

demo地址:iosstrongdemo


二、通常的方法
接下来来看比较通常的方法,哈哈~那么,这一次我将简单的封装一个uitextview。暂且取名叫ggplaceholdertextview,gg前缀看着有点任性的哈。

ggplaceholdertextview简介:
ggplaceholdertextview也是对text操作,具体逻辑如下:

继承uitextview,并设置placeholder属性:
注册开始编辑和结束编辑通知,然后对text做相应的操作
通过uiapplicationwillterminatenotification通知,在app退出的时候移除通知。
我把ggplaceholdertextview写在下面。不过,微信里看代码还是不太方便,我已经把代码push到:iosstrongdemo。你可以下载下来。

复制代码 代码如下:

ggplaceholdertextview.h

#import <uikit/uikit.h>

@interface ggplaceholdertextview : uitextview
@property(nonatomic, strong) nsstring *placeholder;

@end


定义placeholder属性,类似于uitextfield。
复制代码 代码如下:

ggplaceholdertextview.m

#import "ggplaceholdertextview.h"

@implementation ggplaceholdertextview

- (id)initwithframe:(cgrect)frame {
    if (self = [super initwithframe:frame]) {
        [self addobserver];
    }
    return self;
}

- (id)init {
    if (self = [super init]) {
        [self addobserver];
    }
    return self;
}

- (void)setplaceholder:(nsstring *)placeholder
{
    _placeholder = placeholder;
    self.text = placeholder;
    self.textcolor = [uicolor graycolor];
}

-(void)addobserver
{
    //注册通知
    [[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(didbeginediting:) name:uitextviewtextdidbegineditingnotification object:self];
    [[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(didendediting:) name:uitextviewtextdidendeditingnotification object:self];
    [[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(terminate:) name:uiapplicationwillterminatenotification object:[uiapplication sharedapplication]];
}

- (void)terminate:(nsnotification *)notification {
    //移除通知
    [[nsnotificationcenter defaultcenter] removeobserver:self];
}

- (void)didbeginediting:(nsnotification *)notification {
    if ([self.text isequaltostring:self.placeholder]) {
        self.text = @"";
        self.textcolor = [uicolor blackcolor];
    }
}

- (void)didendediting:(nsnotification *)notification {
    if (self.text.length<1) {
        self.text = self.placeholder;
        self.textcolor = [uicolor graycolor];
    }
}

@end


以上就是关于ggplaceholdertextview的实现,如果你有类似需求,直接拿去用吧!具体用法请往下看。

实践:

复制代码 代码如下:

ggplaceholdertextview *textview = [[ggplaceholdertextview alloc] initwithframe:cgrectmake(0, 64, screen.width , 200)];
textview.backgroundcolor = [uicolor whitecolor];
textview.placeholder = @"jb51.net";
[self.view addsubview:textview];


经过封装后的ggplaceholdertextview,使用起来是不是跟uitextfield非常相似。当然,我封装的比较简单,github上也有一些朋友封装带placeholder属性的uitextview。比如:textviewplaceholder。感兴趣的童鞋可以去试用一下。