在UITextField的光标处插入文本(iOS3.0)

来源:互联网 发布:java新建package 编辑:程序博客网 时间:2024/05/01 13:51


原文: http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

 

iOS SDK的文本输入控件(UITextField、UITextView等)从设计起就不支持第3方的扩展。我需要在iPhone应用中提供一个功能:在UITextField当前选中位置插入文本。在UITextField及其父类方法和协议中都找不到这样一个方法。

一种可行的办法是先获取UITextField的内容,在最后追加所需的文本,然后重新设置UITextField的内容。如果光标刚好在UITextField文本的最后位置(通常的情况),这样做是可以的。但如果光标正处于UITextField文本的中间,则就麻烦了。

在iOS3.0中,有一个解决办法。-(void)paste:(id)sender方法可以从系统剪贴板中粘贴文本到光标当前位置。因此我们需要做的就是临时借用一下系统剪贴板。基本上这要经过以下步骤:

  1. 获取系统剪贴板引用
  2. 保存系统剪贴板内容,以备最后能恢复它们
  3. 将系统剪贴板的内容修改为你希望去插入的文本
  4. 发送-(void)paste:(id)sender消息至UITextField或UITextView
  5. 恢复系统剪贴板原来的内容

我们为UIResponder新增了一个类别,并在类别中加入方法-(void)insertText:(NSString*)text,这个方法就能用于任何文本编辑视图。

@interface UIResponder(UIResponderInsertTextAdditions)

- (void) insertText: (NSString*) text;

@end 

@implementation UIResponder(UIResponderInsertTextAdditions) 

- (void) insertText: (NSString*) text {

  // 获取系统剪贴板

  UIPasteboard* generalPasteboard= [UIPasteboard generalPasteboard];

  // 保存系统剪贴板内容,以便最后能恢复它们

  NSArray* items =[generalPasteboard.items copy];  

  //修改系统剪贴板的内容为要插入的文本

  generalPasteboard.string = text;  

  // 告诉responder从系统剪贴板粘贴文本到当前光标位置

  [self paste: self];  

  // 恢复系统剪贴板原有的内容

  generalPasteboard.items = items;  

  // 释放临时数组items

  [items release];

@end