我们计划创建UITextView,实现UITextViewDelegate协议方法,使用NSLog检查该方法何时被调用。我们还会接触到如何在TextView中限制字符的数量,以及如何使用return键隐藏keyboard。看看如何在你的app中实现这些功能。

第一步:创建一个新的Xcode项目

运行Xcode,依次点击File > New > Project,然后在左边点击iOS下面的"Application",右边选中"Single View Application",然后点击“next”。

 

接下来如图中所示,在"Product Name"这一栏键入 "TextViewARC",并在Company Identifier中填入一个值,例如"com.companyName." 。在“Device Family”列表中选择“iPhone”。不要勾选 "Use Storyboards" 和 "Include Unit Tests" ,勾选上"UseAutomatic Reference Counting" 。在点击下一步之前,核对"Use Automatic Reference Counting",然后点击next,并选择一个位置来存储工程,然后点击“create”.

 

 第二步:创建UITextView

UITextView的创建可以通过纯代码或者使用 Interface Builder工具来完成,接下来我们主要介绍如何通过这两种方法来创建一个UITextView。

通过代码创建

点击“ViewController.m”文件,然后输入以下代码:

CGRect textViewFrame = CGRectMake(20.0f, 20.0f, 280.0f, 124.0f); 
UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame]; 
textView.returnKeyType = UIReturnKeyDone; 
[self.view addSubview:textView];

这样创建了一个UITextView对象,并且添加到ViewController视图中。

使用Interface Builder

你可以在.xib文件中创建UITextView。在Xcode的"Navigator"面板中点击 .xib文件,在左侧文档大纲"Document Outline"中点击"View"。在菜单中点击View > Utilities > 展示Object Library。移至Object library的底部左下角,找到"Text View",点击选中,拖放至text view,调整text view位置至顶端, 高度修改为125像素。

第三步:隐藏键盘
隐藏键盘的方法很多,下面我们给出的代码仅是其中的一种方法。点击“ViewController.m”文件,添加以下方法来实现:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"touchesBegan:withEvent:");
    [self.view endEditing:YES];
    [super touchesBegan:touches withEvent:event];
}

第四步:Delegate Protocol Methods

简单说,一个委托协实现两个对象之间的相互通信,在UITextViewDelegate方法中,当特定事件发生时,UITextView就可以传递协议,比如text view开始编辑时。当方法被传递时,你就可以在协议中做自己的一些处理。以下例子演示下如何实现UITextView委托协议方法。

在实现delegate方法之前,为了将viewcontroller对象设置为uitextview的delegate,我们把textview的delegate属性设置为self。点击“ViewController.m”文件,在viewDidLoad方法中,在[self.view addSubview:textView];上面添加以下代码:

textView.delegate = self;

使用Interface Builder,点击"ViewController.xib"文件,选择text view,点击View > Utilities > Show Connections Inspector。在 "Connections Inspector"中点击"Outlets"来打开它。点击页面上"delegate"向对面的圆圈,然后单击该圆圈并将其拖至“File‘s Owner”,以在text view和viewcontroller之间建立好连接。然后点击“ViewController.h”,输入以下代码以遵循UITextViewDelegate protocol。

@interface ViewController : UIViewController <UITextViewDelegate>

UITextView委托协议方法是可选的,也就是说使用UITextViewDelegate协议,但是不一定非得实现相关的协议方法。下边是在它们上边添加的方法。

textViewShouldBeginEditing: and textViewDidBeginEditing:

点击“ViewController.m”文件,添加以下代码:
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{ 
    NSLog(@"textViewShouldBeginEditing:"); 
    return YES;  
} 
- (void)textViewDidBeginEditing:(UITextView *)textView { 
    NSLog(@"textViewDidBeginEditing:"); 
    textView.backgroundColor = [UIColor greenColor]; 
}

在text view获得焦点之前会调用textViewShouldBeginEditing: 方法。当text view获得焦点之后,并且已经是第一响应者(first responder),那么会调用textViewDidBeginEditing: 方法。当text view获得焦点时要想做一些自己的处理,那么就在这里进行。在我们的示例中,当text view获得焦点时,是把text view的背景色设置为绿色.

textViewShouldEndEditing: and textViewDidEndEditing:

在之前的方法中加入以下代码
- (BOOL)textViewShouldEndEditing:(UITextView *)textView{ 
    NSLog(@"textViewShouldEndEditing:"); 
    textView.backgroundColor = [UIColor whiteColor]; 
    return YES; 
} 
- (void)textViewDidEndEditing:(UITextView *)textView{ 
    NSLog(@"textViewDidEndEditing:"); 
}

当text view失去焦点之前会调用textViewShouldEndEditing。在示例中,我们使用textViewShouldEndEditing:让背景色返回最初的颜色。
textView:shouldChangeCharactersInRange:replacementString

在之前的方法中加入以下代码:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ 
    NSCharacterSet *doneButtonCharacterSet = [NSCharacterSet newlineCharacterSet]; 
    NSRange replacementTextRange = [text rangeOfCharacterFromSet:doneButtonCharacterSet]; 
    NSUInteger location = replacementTextRange.location; 
    if (textView.text.length + text.length > 140){ 
    if (location != NSNotFound){ 
        [textView resignFirstResponder]; 
    } 
    return NO; 
    } 
    else if (location != NSNotFound){ 
    [textView resignFirstResponder]; 
    return NO; 
    } 
    return YES; 
}

每次用户通过键盘输入字符时,在字符显示在text view之前,textView:shouldChangeCharactersInRange:replacementString方法会被调用。这个方法中可以方便的定位测试用户输入的字符,并且限制用户输入特定的字符。在上面的代码中,我使用done键来隐藏键盘:通过检测看replacement文本中是否包含newLineCharacterSet任意的字符。

如果有一个字符是来自newLineCharacterSet的,那么说明done按钮被按过了,因此应该将键盘隐藏起来。另外,在用户每次输入内容时,还检测text view当前文本内容的长度,如果大于140个字符,则返回NO,这样text view就可以限制输入140个字符了。

textViewDidChangeSelection:

在之前的方法中加入以下代码:
- (void)textViewDidChangeSelection:(UITextView *)textView{ 
NSLog(@"textViewDidChangeSelection:"); 
}

只有当用户修改了text view中的内容时,textViewDidChange:方法才会被调用。在该方法中,可以对用户修改了text view中的内容进行验证,以满足自己的一些实际需求。例如,这里有一个应用场景:当text view限制最多可以输入140个字符时,此时,在用户修改文本内容时,你希望显示出还可以输入多少个字符。那么每次文本内容被用户修改的时候,更新并显示一下剩余可输入的字符个数即可。

textViewDidChangeSelection:

在之前的方法中加入以下代码:

- (void)textViewDidChangeSelection:(UITextView *)textView{
NSLog(@"textViewDidChangeSelection:");
}

当用户选择text view中的部分内容,或者更改文本选择的范围,或者在text view中粘贴入文本时,函数textViewDidChangeSelection:将会被调用。该方法一般不使用,不过在某些情况下,非常有用。

第五步:测试Text Views

点击Product>Run,或者点击左上角的"Run",然后打开console窗口,并在text view中做一些字符输入,删除操作。当delegate方法被调用时,NSLog会打印出相应的字符串。


 
在模拟器上展示text view

ios之UITextView的更多相关文章

  1. iOS UILabel UITextView UIButton 等等显示文本行间距

    iOS UILabel  UITextView UIButton 等等显示文本行间距都用如下方法 NSMutableParagraphStyle *paragraphStyle = [[NSMutab ...

  2. iOS中UITextView键盘回收

    iOS开发中,发现UITextView没有像UITextField中textFieldShouldReturn:这样的方法,那么要实现UITextView关闭键盘,就必须使用其他的方法,下面是可以使用 ...

  3. IOS UITextField &UITextView

    UITextField 限制textField长度 曾经,以为输入框只是输入字符的,但真的认真为一个登陆界面输入框而改了六七次以后,发现好烦人啊,先谢谢测试的不厌其烦,不杀之恩,不想再用IOS的输入框 ...

  4. ios swift UITextView高度自适应

    在ios开发中,用到多行输入时一般都会用到UITextView.常见的比如说聊天输入框,评论输入框等,当用户输入多内容时,我们希望高度能根据用户输入的内容扩大而扩大.其实实现这个功能也不是很难,只需要 ...

  5. iOS开发-UITextView根据内容自适应高度

    UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: -(UITextView * ...

  6. iOS:个性化UITextView(缩进,行距,铺满)

    总体来说个性化定制UITextView中的内容有两种方法: 1,从文件中读取内容到UITextView,这个个人感觉使用rtfd和rtf格式文件效果非常好. 2,使用NSAttributeString ...

  7. iOS - UI - UITextView

    1.UITextView //因为继承于UIScrollView 拥有scrollView的所有属性和方法 //placeholder只有UITextField有,UITextView是没有的.(提示 ...

  8. iOS 之 UITextView

    _lableAssess = [[UITextView alloc] init]; [_lableAssess setFrame:CGRectMake(left2, top2, width2, siz ...

  9. iOS 给UITextView加一个placeholder

    苹果并没有为UITextView提供placeholder功能.我们可以通过两种办法实现. 方法一: 思路:设置默认显示的文字,颜色设置为灰色.代理方法监听textView点击. 缺点:如果点击到文字 ...

随机推荐

  1. 后Selenium时代,网页自动化测试用Cypress

    本文技术难度★★★,初学自动化测试的朋友慎点!否则会引起焦虑等不适症状,严重者会怀疑自己技术人生! 来自Cypress官网首页! Web开发飞速换代! table控制页面OUT了! 原生态手写网页OU ...

  2. 从MySQL高可用引出对高可用架构设计的一些思考

    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...

  3. Mycat(1)

    https://www.jianshu.com/p/26513f428ecf https://blog.csdn.net/fly910905/article/details/87101059 http ...

  4. B - Halloween Costumes

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  5. Metasploits之ms10_018

    漏洞详情:https://technet.microsoft.com/library/security/ms10-018 一准备: 1:kali Linux系统 192.168.195.129 2:W ...

  6. 子shell

    http://bbs.csdn.net/topics/392292455 https://www.cnblogs.com/daniaoge/p/6161821.html http://blog.csd ...

  7. Gym - 101147J Whistle's New Car 树上差分

    J. Whistle's New Car time limit per test 15 seconds memory limit per test 512 megabytes input car.in ...

  8. 17995 Stupid thief 组合数学

    17995 Stupid thief 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: 不限定 Description A stupid thie ...

  9. Haproxy常见用法

    简介 HAProxy 提供高可用性.负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机, 它是免费.快速并且可靠的一种解决方案. HAProxy 特别适用于那些负载特大的 web 站点, ...

  10. Redis的发布和订阅

    Redis的发布和订阅 Redis发布订阅(pub/sub)是一种消息通信模式,pub发布消息,sub接收消息.(pub/sub)是一种生产者消费者模式,是实现消息队列的一种方式 redis的订阅和发 ...