UITextView

本文详细介绍如何在iOS应用中创建和使用UITextView,包括通过代码和Interface Builder创建UITextView,实现UITextViewDelegate协议来监听和控制文本编辑过程,以及如何限制文本输入长度和使用返回键隐藏键盘。

我们计划创建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:将会被调用。该方法一般不使用,不过在某些情况下,非常有用。

### UITextView 的使用方法及常见问题解决 UITextView 是 UIKit 框架中的一个类,用于显示多行文本,并支持编辑和富文本格式。以下是对 UITextView 的基本使用方法以及常见问题的解决方案。 #### 基本使用方法 创建一个 UITextView 可以通过代码或 Interface Builder 完成。以下是一个简单的示例,展示如何在代码中初始化并配置 UITextView: ```swift import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 创建一个 UITextView 实例 let textView = UITextView(frame: CGRect(x: 20, y: 100, width: 300, height: 200)) // 配置属性 textView.text = "这是一个 UITextView 示例" // 设置初始文本 textView.font = UIFont.systemFont(ofSize: 16) // 设置字体 textView.textColor = UIColor.black // 设置文本颜色 textView.backgroundColor = UIColor.lightGray // 设置背景颜色 textView.isEditable = true // 是否可编辑 textView.isScrollEnabled = true // 是否启用滚动 textView.delegate = self // 设置代理 // 添加到视图层次结构中 self.view.addSubview(textView) } } // 实现 UITextViewDelegate 协议 extension ViewController: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { print("当前文本内容为:\(textView.text)") } } ``` 上述代码展示了如何创建、配置和使用 UITextView[^4]。此外,还可以通过 Interface Builder 在 Storyboard 或 XIB 文件中拖拽 UITextView 组件,并设置其约束和属性。 #### 常见问题及解决方案 1. **限制输入字符数** 如果需要限制用户输入的字符数,可以通过实现 `UITextViewDelegate` 方法来实现: ```swift func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let currentText = textView.text ?? "" guard let stringRange = Range(range, in: currentText) else { return false } let updatedText = currentText.replacingCharacters(in: stringRange, with: text) return updatedText.count <= 100 // 限制最大字符数为 100 } ``` 2. **自动调整高度** 若要根据内容动态调整 UITextView 的高度,可以监听 `contentSize` 的变化: ```swift textView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil) override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "contentSize" { if let newSize = change?[.newKey] as? CGSize { textView.frame.size.height = newSize.height } } } ``` 3. **去除默认内边距** UITextView 默认有一个内边距(textContainerInset),可以通过以下方式移除: ```swift textView.textContainerInset = .zero textView.textContainer.lineFragmentPadding = 0 ``` 4. **检测链接点击** 若要检测用户点击的链接,可以启用数据探测器并实现 `UITextViewDelegate` 方法: ```swift textView.dataDetectorTypes = .link func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { print("点击了链接:\(URL)") return true } ``` #### 性能优化 当 UITextView 用于显示大量文本时,可能会出现性能问题。为了提高性能,可以考虑以下几点: - 禁用不必要的功能,例如拼写检查和语法高亮。 - 使用 `attributedText` 替代 `text` 属性以减少渲染开销。 - 如果不需要滚动,可以禁用滚动功能以节省资源。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值