在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享。比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容。
概述
在iOS中下面三个控件,自身就有复制-粘贴的功能:
1、UITextView
2、UITextField
3、UIWebView
UIKit framework提供了几个类和协议方便我们在自己的应用程序中实现剪贴板的功能。
1、UIPasteboard:我们可以向其中写入数据,也可以读取数据
2、UIMenuController:显示一个快捷菜单,用来复制、剪贴、粘贴选择的项。
3、UIResponder中的 canPerformAction:withSender:用于控制哪些命令显示在快捷菜单中。
4、当快捷菜单上的命令点击的时候,UIResponderStandardEditActions将会被调用。
下面这些项能被放置到剪贴板中
1、UIPasteboardTypeListString — 字符串数组, 包含kUTTypeUTF8PlainText
2、UIPasteboardTypeListURL — URL数组,包含kUTTypeURL
3、UIPasteboardTypeListImage — 图形数组, 包含kUTTypePNG 和kUTTypeJPEG
4、UIPasteboardTypeListColor — 颜色数组
剪贴板的类型分为两种:
系统级:使用UIPasteboardNameGeneral和UIPasteboardNameFind,系统级应用程序关闭,或者卸载的数据不会丢失。
应用程序级:通过设置,可以让数据在应用程序关闭之后仍然保存在剪贴板中,但是应用程序卸载之后数据就会失去。我们可用通过pasteboardWithName:create:来创建。
了解这些之后,下面通过一系列的例子来说明如何在应用程序中使用剪贴板。
例子:
一、复制剪贴文本。
下面通过一个例子,可以在tableview上显示一个快捷菜单,上面只有复制按钮,复制tableview上的数据之后,然后粘贴到title上。
定义一个单元格类CopyTableViewCell,在这个类的上显示快捷菜单,实现复制功能。
@interface CopyTableViewCell : UITableViewCell {
id delegate;
}
@property (nonatomic, retain) id delegate;
@end
实现CopyTableViewCell ,实现粘贴:
- #import"CopyTableViewCell.h"
- @implementationCopyTableViewCell
- @synthesizedelegate;
- -(id)initWithStyle:(UITableViewCellStyle)stylereuseIdentifier:(NSString*)reuseIdentifier{
- if((self=[superinitWithStyle:stylereuseIdentifier:reuseIdentifier])){
- }
- returnself;
- }
- -(void)setSelected:(BOOL)selectedanimated:(BOOL)animated{
- [supersetSelected:selectedanimated:animated];
- }
- -(void)setHighlighted:(BOOL)highlightedanimated:(BOOL)animated{
- [[selfdelegate]performSelector:@selector(showMenu:)
- withObject:selfafterDelay:0.9f];
- [supersetHighlighted:highlightedanimated:animated];
- }
- -(BOOL)canBecomeFirstResponder
- {
- returnYES;
- }
- -(BOOL)canPerformAction:(SEL)actionwithSender:(id)sender{
- if(action==@selector(cut:)){
- returnNO;
- }
- elseif(action==@selector(copy:)){
- returnYES;
- }
- elseif(action==@selector(paste:)){
- returnNO;
- }
- elseif(action==@selector(select:)){
- returnNO;
- }
- elseif(action==@selector(selectAll:)){
- returnNO;
- }
- else
- {
- return[supercanPerformAction:actionwithSender:sender];
- }
- }
- -(void)copy:(id)sender{
- UIPasteboard*pasteboard=[UIPasteboardgeneralPasteboard];
- [pasteboardsetString:[[selftextLabel]text]];
- }
- -(void)dealloc{
- [superdealloc];
- }
- @end
定义CopyPasteTextController
- @interfaceCopyPasteTextController:UIViewController<UITableViewDelegate>{
- //用来标识是否显示快捷菜单
- BOOLmenuVisible;
- UITableView*tableView;
- }
- @property(nonatomic,getter=isMenuVisible)BOOLmenuVisible;
- @property(nonatomic,retain)IBOutletUITableView*tableView;
- @end
实现CopyPasteTextController :
- #import"CopyPasteTextController.h"
- #import"CopyTableViewCell.h"
- @implementationCopyPasteTextController
- @synthesizemenuVisible,tableView;
- -(void)viewDidLoad{
- [superviewDidLoad];
- [selfsetTitle:@"文字复制粘贴"];
- //点击这个按钮将剪贴板的内容粘贴到title上
- UIBarButtonItem*addButton=[[[UIBarButtonItemalloc]
- initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
- target:self
- action:@selector(readFromPasteboard:)]
- autorelease];
- [[selfnavigationItem]setRightBarButtonItem:addButton];
- }
- //Customizethenumberofsectionsinthetableview.
- -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
- {
- return1;
- }
- -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section
- {
- return9;
- }
- //Customizetheappearanceoftableviewcells.
- -(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath
- {
- staticNSString*CellIdentifier=@"Cell";
- CopyTableViewCell*cell=(CopyTableViewCell*)[tableView
- dequeueReusableCellWithIdentifier:CellIdentifier];
- if(cell==nil)
- {
- cell=[[[CopyTableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]autorelease];
- [cellsetDelegate:self];
- }
- //Configurethecell.
- NSString*text=[NSStringstringWithFormat:@"Row%d",[indexPathrow]];
- [[celltextLabel]setText:text];
- returncell;
- }
- -(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath
- {
- if([selfisMenuVisible])
- {
- return;
- }
- [[[selftableView]cellForRowAtIndexPath:indexPath]setSelected:YES
- animated:YES];
- }
- //显示菜单
- -(void)showMenu:(id)cell{
- if([cellisHighlighted]){
- [cellbecomeFirstResponder];
- UIMenuController*menu=[UIMenuControllersharedMenuController];
- [menusetTargetRect:[cellframe]inView:[selfview]];
- [menusetMenuVisible:YESanimated:YES];
- }
- }
- -(void)readFromPasteboard:(id)sender{
- [selfsetTitle:[NSStringstringWithFormat:@"Pasteboard=%@",
- [[UIPasteboardgeneralPasteboard]string]]];
- }
- -(void)didReceiveMemoryWarning
- {
- //Releasestheviewifitdoesn'thaveasuperview.
- [superdidReceiveMemoryWarning];
- //Relinquishownershipanycacheddata,images,etcthataren'tinuse.
- }
- -(void)viewDidUnload
- {
- [superviewDidUnload];
- [self.tableViewrelease];
- //RelinquishownershipofanythingthatcanberecreatedinviewDidLoadorondemand.
- //Forexample:self.myOutlet=nil;
- }
效果:
复制一行数据:
点击右上角的按钮粘贴,将数据显示在title上:
二、图片复制粘贴
下面通过一个例子,将图片复制和剪贴到另外一个UIImageView中间。
1、在界面上放置两个uiimageview,一个是图片的数据源,一个是将图片粘贴到的地方。CopyPasteImageViewController 代码如下:
- @interfaceCopyPasteImageViewController:UIViewController{
- UIImageView*imageView;
- UIImageView*pasteView;
- UIImageView*selectedView;
- }
- @property(nonatomic,retain)IBOutletUIImageView*imageView;
- @property(nonatomic,retain)IBOutletUIImageView*pasteView;
- @property(nonatomic,retain)UIImageView*selectedView;
- -(void)placeImageOnPasteboard:(id)view;
- @end
2、当触摸图片的时候我们显示快捷菜单:
- -(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{
- NSSet*copyTouches=[eventtouchesForView:imageView];
- NSSet*pasteTouches=[eventtouchesForView:pasteView];
- [selfbecomeFirstResponder];
- if([copyTouchescount]>0){
- [selfperformSelector:@selector(showMenu:)
- withObject:imageViewafterDelay:0.9f];
- }
- elseif([pasteTouchescount]>0){
- [selfperformSelector:@selector(showMenu:)
- withObject:pasteViewafterDelay:0.9f];
- }
- [supertouchesBegan:toucheswithEvent:event];
- }
- -(void)showMenu:(id)view{
- [selfsetSelectedView:view];
- UIMenuController*menu=[UIMenuControllersharedMenuController];
- [menusetTargetRect:CGRectMake(5,10,1,1)inView:view];
- [menusetMenuVisible:YESanimated:YES];
- }
这里的快捷菜单,显示三个菜单项:剪贴、粘贴、复制:
- -(BOOL)canPerformAction:(SEL)actionwithSender:(id)sender{
- if(action==@selector(cut:)){
- return([selfselectedView]==imageView)?YES:NO;
- }elseif(action==@selector(copy:)){
- return([selfselectedView]==imageView)?YES:NO;
- }elseif(action==@selector(paste:)){
- return([selfselectedView]==pasteView)?YES:NO;
- }elseif(action==@selector(select:)){
- returnNO;
- }elseif(action==@selector(selectAll:)){
- returnNO;
- }else{
- return[supercanPerformAction:actionwithSender:sender];
- }
- }
- -(void)cut:(id)sender{
- [selfcopy:sender];
- [imageViewsetHidden:YES];
- }
- -(void)copy:(id)sender{
- [selfplaceImageOnPasteboard:[selfimageView]];
- }
- -(void)paste:(id)sender{
- UIPasteboard*appPasteBoard=
- [UIPasteboardpasteboardWithName:@"CopyPasteImage"create:YES];
- NSData*data=[appPasteBoarddataForPasteboardType:@"com.marizack.CopyPasteImage.imageView"];
- pasteView.image=[UIImageimageWithData:data];
- }
效果:
1、点击图片,显示菜单按钮。
2、点击复制,将数据复制到剪贴板上:
3、点击粘贴,将数据粘贴到uiimageview上。
总结:
本文详解了iOS系统应用程序中如何使用剪贴板。