`
ttsiangogole
  • 浏览: 73384 次
文章分类
社区版块
存档分类
最新评论

iOS开发之详解剪贴板

阅读更多

    在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享。比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容。
<h1>概述</h1>
在iOS中下面三个控件,自身就有复制-粘贴的功能:

1、UITextView<br>
2、UITextField<br>
3、UIWebView

UIKit framework提供了几个类和协议方便我们在自己的应用程序中实现剪贴板的功能。

1、UIPasteboard:我们可以向其中写入数据,也可以读取数据

2、UIMenuController:显示一个快捷菜单,用来复制、剪贴、粘贴选择的项。

3、UIResponder中的 canPerformAction:withSender:用于控制哪些命令显示在快捷菜单中。

4、当快捷菜单上的命令点击的时候,UIResponderStandardEditActions将会被调用。

下面这些项能被放置到剪贴板中

1、UIPasteboardTypeListString — 字符串数组, 包含kUTTypeUTF8PlainText<br>
2、UIPasteboardTypeListURL — URL数组,包含kUTTypeURL<br>
3、UIPasteboardTypeListImage — 图形数组, 包含kUTTypePNG 和kUTTypeJPEG<br>
4、UIPasteboardTypeListColor — 颜色数组

剪贴板的类型分为两种:

系统级:使用UIPasteboardNameGeneral和UIPasteboardNameFind,系统级应用程序关闭,或者卸载的数据不会丢失。

应用程序级:通过设置,可以让数据在应用程序关闭之后仍然保存在剪贴板中,但是应用程序卸载之后数据就会失去。我们可用通过pasteboardWithName:create:来创建。

了解这些之后,下面通过一系列的例子来说明如何在应用程序中使用剪贴板。

<h1>例子:</h1>
<h2>一、复制剪贴文本。</h2>
下面通过一个例子,可以在tableview上显示一个快捷菜单,上面只有复制按钮,复制tableview上的数据之后,然后粘贴到title上。

<h3>定义一个单元格类CopyTableViewCell,在这个类的上显示快捷菜单,实现复制功能。</h3>
@interface CopyTableViewCell : UITableViewCell {<br>
id delegate;<br>
}<br>
@property (nonatomic, retain) id delegate;<br>
@end

<br>

<h3>实现CopyTableViewCell ,实现粘贴:</h3>
<textarea readonly name="code" class="plain">#import "CopyTableViewCell.h"

@implementation CopyTableViewCell

@synthesize delegate;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
    }
    return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [[self delegate] performSelector:@selector(showMenu:)
                          withObject:self afterDelay:0.9f];
   
    [super setHighlighted:highlighted animated:animated];

}
- (BOOL)canBecomeFirstResponder
{
    return YES;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    if (action == @selector(cut:)){
        return NO;
    }
    else if(action == @selector(copy:)){
        return YES;
    }
    else if(action == @selector(paste:)){
        return NO;
    }
    else if(action == @selector(select:)){
        return NO;
    }
    else if(action == @selector(selectAll:)){
        return NO;
    }
    else
    {
        return [super canPerformAction:action withSender:sender];
    }
}
- (void)copy:(id)sender {
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    [pasteboard setString:[[self textLabel]text]];
}
- (void)dealloc {
    [super dealloc];
}
@end

</textarea>定义CopyPasteTextController

<textarea readonly name="code" class="plain">@interface CopyPasteTextController : UIViewController<UITableViewDelegate> {
    //用来标识是否显示快捷菜单
    BOOL menuVisible;
    UITableView *tableView;
}

@property (nonatomic, getter=isMenuVisible) BOOL menuVisible;

@property (nonatomic, retain) IBOutlet UITableView *tableView;
@end </textarea>实现CopyPasteTextController :

<textarea readonly name="code" class="plain">#import "CopyPasteTextController.h"
#import "CopyTableViewCell.h"

@implementation CopyPasteTextController
@synthesize menuVisible,tableView;
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setTitle:@"文字复制粘贴"];
    //点击这个按钮将剪贴板的内容粘贴到title上
    UIBarButtonItem *addButton = [[[UIBarButtonItem alloc]
                                      initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                                      target:self
                                      action:@selector(readFromPasteboard:)]
                                     autorelease];
    [[self navigationItem] setRightBarButtonItem:addButton];
}


// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 9;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier =@"Cell";
    CopyTableViewCell *cell = (CopyTableViewCell *)[tableView
                                                           dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[CopyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        [cell setDelegate:self];
    }
   
    // Configure the cell.
    NSString *text = [NSString stringWithFormat:@"Row %d", [indexPath row]];
    [[cell textLabel] setText:text];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([self isMenuVisible])
    {
        return;
    }
    [[[self tableView] cellForRowAtIndexPath:indexPath] setSelected:YES
                                                           animated:YES];
}
//显示菜单
- (void)showMenu:(id)cell {
    if ([cell isHighlighted]) {
        [cell becomeFirstResponder];
       
        UIMenuController * menu = [UIMenuController sharedMenuController];
        [menu setTargetRect: [cell frame] inView: [self view]];
        [menu setMenuVisible: YES animated: YES];
    }
}
- (void)readFromPasteboard:(id)sender {
    [self setTitle:[NSString stringWithFormat:@"Pasteboard = %@",
                      [[UIPasteboard generalPasteboard] string]]];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
   
    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    [self.tableView release];
   
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}</textarea><br>

<h2>效果:</h2>
<h3>复制一行数据:</h3>
<img alt="" src="http://hi.csdn.net/attachment/201108/4/0_131246128526sB.gif">

<h3>点击右上角的按钮粘贴,将数据显示在title上:</h3>
<img alt="" src="http://hi.csdn.net/attachment/201108/4/0_13124612934www.gif">

<h2>二、图片复制粘贴</h2>
下面通过一个例子,将图片复制和剪贴到另外一个UIImageView中间。

<h3>1、在界面上放置两个uiimageview,一个是图片的数据源,一个是将图片粘贴到的地方。CopyPasteImageViewController 代码如下:<br>
</h3>
<textarea readonly name="code" class="plain">@interface CopyPasteImageViewController : UIViewController {
    UIImageView *imageView;
    UIImageView *pasteView;
    UIImageView *selectedView;
}
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UIImageView *pasteView;
@property (nonatomic, retain) UIImageView *selectedView;
- (void)placeImageOnPasteboard:(id)view;
@end
</textarea><h3>
<br>
2、当触摸图片的时候我们显示快捷菜单:</h3>
<textarea readonly name="code" class="plain">- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    NSSet *copyTouches = [event touchesForView:imageView];
    NSSet *pasteTouches = [event touchesForView:pasteView];
   
    [self becomeFirstResponder];
    if ([copyTouches count] > 0) {
        [self performSelector:@selector(showMenu:)
                   withObject:imageView afterDelay:0.9f];
    }
    else  if([pasteTouches count] > 0) {
        [self performSelector:@selector(showMenu:)
                   withObject:pasteView afterDelay:0.9f];
    }
    [super touchesBegan:touches withEvent:event];
}

- (void)showMenu:(id)view {
    [self setSelectedView:view];
   
    UIMenuController * menu = [UIMenuController sharedMenuController];
    [menu setTargetRect: CGRectMake(5, 10, 1, 1) inView: view];
    [menu setMenuVisible: YES animated: YES];
}</textarea><br>
这里的快捷菜单,显示三个菜单项:剪贴、粘贴、复制:

<textarea readonly name="code" class="plain">- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    if (action == @selector(cut:)) {
        return ([self selectedView] == imageView) ? YES : NO;
    } else if (action == @selector(copy:)) {
        return ([self selectedView] == imageView) ? YES : NO;
    } else if (action == @selector(paste:)) {
        return ([self selectedView] == pasteView) ? YES : NO;
    } else if (action == @selector(select:)) {
        return NO;
    } else if (action == @selector(selectAll:)) {
        return NO;
    } else {
        return [super canPerformAction:action withSender:sender];
    }
}
- (void)cut:(id)sender {
    [self copy:sender];
    [imageView setHidden:YES];
}
- (void)copy:(id)sender {
    [self placeImageOnPasteboard:[self imageView]];
}
- (void)paste:(id)sender {
    UIPasteboard *appPasteBoard =
    [UIPasteboard pasteboardWithName:@"CopyPasteImage" create:YES];
    NSData *data =[appPasteBoard dataForPasteboardType:@"com.marizack.CopyPasteImage.imageView"];
    pasteView.image = [UIImage imageWithData:data];
}</textarea><h2>
<br>
效果:</h2>
<h3>1、点击图片,显示菜单按钮。</h3>
<img alt="" src="http://hi.csdn.net/attachment/201108/4/0_1312461301aoIY.gif">

<h3>2、点击复制,将数据复制到剪贴板上:</h3>
<img alt="" src="http://hi.csdn.net/attachment/201108/4/0_13124613107V0o.gif">

<h3>3、点击粘贴,将数据粘贴到uiimageview上。</h3>
<img alt="" src="http://hi.csdn.net/attachment/201108/4/0_1312461318P57J.gif">

<h1>总结:</h1>
本文详解了iOS系统应用程序中如何使用剪贴板。

 
0
1
分享到:
评论

相关推荐

    iOS软件开发之详解剪贴板.pdf

    在iOS软件开发中,剪贴板是一个至关重要的概念,它允许开发者在不同的应用程序之间或同一应用内部实现数据的快速共享。iOS系统提供了多种内置控件,如`UITextView`、`UITextField`和`UIWebView`,它们已经集成了基本...

    iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    在iOS开发中,UIPasteboard类是用于管理剪切板的核心工具,它可以处理文本、图像、URL等数据的复制、剪切和粘贴操作。UIPasteboard提供了多种方法,允许开发者方便地存取和管理剪切板上的内容,实现应用内和应用间的...

    iOS13.4 Xcode真机支持文件

    5. **第三方键盘支持**:第三方键盘现在可以访问剪贴板数据,提高其功能和实用性。 **二、Xcode与真机支持** Xcode 11.4是支持iOS 13.4开发和测试的主要版本。真机支持文件是Xcode用于与连接的iOS设备进行通信的...

    ClipboardPluginSample:一个 AppBuilder 示例,它利用了 Cordova 剪贴板插件

    **标题解析:** "ClipboardPluginSample...通过研究这个示例项目,开发者可以学习到如何在 Cordova 应用中集成剪贴板功能,以及如何在 AppBuilder 中管理项目和插件,对于提升 JavaScript 和移动开发技能有很大帮助。

    iOS中对文本的字符限制示例详解

    // 这里可以添加保存逻辑,例如将文本存入剪贴板或进行其他处理 } ``` 在上述代码中,我们通过监听文本框编辑变化事件,对输入的文本进行实时判断和处理,包括判断是否符合中英文数字的输入规则、统计文本长度并...

    Professional iPhone and iPad Application Development

    本章将讲解如何在iOS应用中实现剪贴板功能,内容包括: - 使用UIPasteboard类进行数据的复制和粘贴。 - 支持多种数据类型的剪贴板操作。 - 处理剪贴板事件的方法,如自动完成建议等。 ##### 第12章:单元测试 单元...

    xamarin官方中文版文档详解

    官方文档中包括了如何使用Xamarin.Essentials来访问加速计、应用信息、电池状态等设备信息,以及进行剪贴板操作、处理地理编码等。 在数据和云服务方面,官方文档探讨了如何使用Azure Active Directory、Azure ...

    copy2cb:将文本直接发送到Android手机(Almos)到剪贴板

    《使用JavaScript实现文本快速传输至Android手机剪贴板——copy2cb详解》 在现代的移动设备使用场景中,高效地传输数据,尤其是文本信息,是用户日常需求的一部分。"copy2cb" 是一个巧妙的解决方案,它允许用户将...

    Origin6.0实例教程.ppt

    - 通过键盘输入数据、导入文件或从剪贴板粘贴数据等方式创建数据文件。 #### 3. 数据的编辑 - 提供了丰富的数据编辑功能,如排序、过滤、计算等。 #### 4. 绘制图形 - 支持多种图表类型的绘制,如折线图、柱状图、...

    Delphi学习案例.docx

    这个简单的示例不仅展示了 Delphi 的基本使用方法,还涵盖了 Delphi 中的一些核心概念和技术,如 VCL 控件的使用、文件操作、剪切板操作等。这对于初学者来说是一个很好的入门案例,可以帮助他们快速掌握 Delphi 的...

    ZeroClipboard.js实现js复制功能

    在Web开发中,我们经常遇到需要实现文本复制功能的情况,比如用户点击按钮就能将一段文字复制到剪贴板。在浏览器的沙盒环境中,JavaScript不能直接访问系统剪贴板,但是可以通过一些库来间接实现这一功能。其中,...

    uni-app的学习第三节

    4. `uni.setClipboardData`:将图片URL复制到剪贴板,用户可以快速分享图片链接。 四、图片适配策略 1. 响应式图片:uni-app支持`v-bind:src`和`:srcset`属性,可以根据设备的像素密度(DPR)自动选择合适的图片。 ...

    Web Uploader文件上传插件使用详解

    粘贴功能特别适用于从剪贴板中直接添加图片,如使用QQ截图或其他截图工具后。 4. **HTML5与Flash兼容**:Web Uploader的接口对HTML5和Flash保持一致,无论使用哪种内核,用户都无需关心内部实现。Flash部分不涉及...

Global site tag (gtag.js) - Google Analytics