天天看點

iOS開發值詳解剪貼闆  

在iOS中,可以使用剪貼闆實作應用程式之中以及應用程式之間實作資料的共享。比如你可以從iPhone QQ複制一個url,然後粘貼到safari浏覽器中檢視這個連結的内容。 概述 在iOS中下面三個

在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 ,實作粘貼:

view plain

  1. #import "CopyTableViewCell.h"  
  2. @implementation CopyTableViewCell  
  3. @synthesize delegate;  
  4. - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {  
  5.     if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {  
  6.     }  
  7.     return self;  
  8. }  
  9. - (void)setSelected:(BOOL)selected animated:(BOOL)animated {  
  10.     [super setSelected:selected animated:animated];  
  11. }  
  12. - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {  
  13.     [[self delegate] performSelector:@selector(showMenu:)   
  14.                           withObject:self afterDelay:0.9f];  
  15.     [super setHighlighted:highlighted animated:animated];  
  16. }  
  17. - (BOOL)canBecomeFirstResponder   
  18. {  
  19.     return YES;  
  20. }  
  21. - (BOOL)canPerformAction:(SEL)action withSender:(id)sender{  
  22.     if (action == @selector(cut:)){  
  23.         return NO;  
  24.     }   
  25.     else if(action == @selector(copy:)){  
  26.         return YES;  
  27.     }   
  28.     else if(action == @selector(paste:)){  
  29.         return NO;  
  30.     }   
  31.     else if(action == @selector(select:)){  
  32.         return NO;  
  33.     }   
  34.     else if(action == @selector(selectAll:)){  
  35.         return NO;  
  36.     }  
  37.     else   
  38.     {  
  39.         return [super canPerformAction:action withSender:sender];  
  40.     }  
  41. }  
  42. - (void)copy:(id)sender {  
  43.     UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];  
  44.     [pasteboard setString:[[self textLabel]text]];  
  45. }  
  46. - (void)dealloc {  
  47.     [super dealloc];  
  48. }  
  49. @end  

定義CopyPasteTextController

view plain

  1. @interface CopyPasteTextController : UIViewController<UITableViewDelegate> {  
  2.     //用來辨別是否顯示快捷菜單  
  3.     BOOL menuVisible;  
  4.     UITableView *tableView;  
  5. }  
  6. @property (nonatomic, getter=isMenuVisible) BOOL menuVisible;  
  7. @property (nonatomic, retain) IBOutlet UITableView *tableView;  
  8. @end   

實作CopyPasteTextController :

view plain

  1. #import "CopyPasteTextController.h"  
  2. #import "CopyTableViewCell.h"  
  3. @implementation CopyPasteTextController  
  4. @synthesize menuVisible,tableView;  
  5. - (void)viewDidLoad {  
  6.     [super viewDidLoad];  
  7.     [self setTitle:@"文字複制粘貼"];  
  8.     //點選這個按鈕将剪貼闆的内容粘貼到title上  
  9.     UIBarButtonItem *addButton = [[[UIBarButtonItem alloc]   
  10.                                       initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh  
  11.                                       target:self  
  12.                                       action:@selector(readFromPasteboard:)]   
  13.                                      autorelease];  
  14.     [[self navigationItem] setRightBarButtonItem:addButton];  
  15. }  
  16. // Customize the number of sections in the table view.  
  17. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  18. {  
  19.     return 1;  
  20. }  
  21. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  22. {  
  23.     return 9;  
  24. }  
  25. // Customize the appearance of table view cells.  
  26. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  27. {  
  28.     static NSString *CellIdentifier =@"Cell";  
  29.     CopyTableViewCell *cell = (CopyTableViewCell *)[tableView   
  30.                                                            dequeueReusableCellWithIdentifier:CellIdentifier];  
  31.     if (cell == nil)   
  32.     {  
  33.         cell = [[[CopyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
  34.         [cell setDelegate:self];  
  35.     }  
  36.     // Configure the cell.  
  37.     NSString *text = [NSString stringWithFormat:@"Row %d", [indexPath row]];  
  38.     [[cell textLabel] setText:text];  
  39.     return cell;  
  40. }  
  41. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  
  42. {  
  43.     if([self isMenuVisible])  
  44.     {  
  45.         return;  
  46.     }  
  47.     [[[self tableView] cellForRowAtIndexPath:indexPath] setSelected:YES   
  48.                                                            animated:YES];  
  49. }  
  50. //顯示菜單  
  51. - (void)showMenu:(id)cell {  
  52.     if ([cell isHighlighted]) {  
  53.         [cell becomeFirstResponder];  
  54.         UIMenuController * menu = [UIMenuController sharedMenuController];  
  55.         [menu setTargetRect: [cell frame] inView: [self view]];  
  56.         [menu setMenuVisible: YES animated: YES];  
  57.     }  
  58. }  
  59. - (void)readFromPasteboard:(id)sender {  
  60.     [self setTitle:[NSString stringWithFormat:@"Pasteboard = %@",   
  61.                       [[UIPasteboard generalPasteboard] string]]];  
  62. }  
  63. - (void)didReceiveMemoryWarning  
  64. {  
  65.     // Releases the view if it doesn't have a superview.  
  66.     [super didReceiveMemoryWarning];  
  67.     // Relinquish ownership any cached data, images, etc that aren't in use.  
  68. }  
  69. - (void)viewDidUnload  
  70. {  
  71.     [super viewDidUnload];  
  72.     [self.tableView release];  
  73.     // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.  
  74.     // For example: self.myOutlet = nil;  
  75. }  

效果:

複制一行資料:

iOS開發值詳解剪貼闆  

點選右上角的按鈕粘貼,将資料顯示在title上:

iOS開發值詳解剪貼闆  

二、圖檔複制粘貼

   下面通過一個例子,将圖檔複制和剪貼到另外一個UIImageView中間。

1、在界面上放置兩個uiimageview,一個是圖檔的資料源,一個是将圖檔粘貼到的地方。CopyPasteImageViewController 代碼如下:

view plain

  1. @interface CopyPasteImageViewController : UIViewController {  
  2.     UIImageView *imageView;  
  3.     UIImageView *pasteView;  
  4.     UIImageView *selectedView;  
  5. }  
  6. @property (nonatomic, retain) IBOutlet UIImageView *imageView;  
  7. @property (nonatomic, retain) IBOutlet UIImageView *pasteView;  
  8. @property (nonatomic, retain) UIImageView *selectedView;  
  9. - (void)placeImageOnPasteboard:(id)view;  
  10. @end  

2、當觸摸圖檔的時候我們顯示快捷菜單:

view plain

  1. - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {  
  2.     NSSet *copyTouches = [event touchesForView:imageView];  
  3.     NSSet *pasteTouches = [event touchesForView:pasteView];  
  4.     [self becomeFirstResponder];  
  5.     if ([copyTouches count] > 0) {  
  6.         [self performSelector:@selector(showMenu:)   
  7.                    withObject:imageView afterDelay:0.9f];  
  8.     }  
  9.     else  if([pasteTouches count] > 0) {  
  10.         [self performSelector:@selector(showMenu:)   
  11.                    withObject:pasteView afterDelay:0.9f];  
  12.     }  
  13.     [super touchesBegan:touches withEvent:event];  
  14. }  
  15. - (void)showMenu:(id)view {  
  16.     [self setSelectedView:view];  
  17.     UIMenuController * menu = [UIMenuController sharedMenuController];  
  18.     [menu setTargetRect: CGRectMake(5, 10, 1, 1) inView: view];  
  19.     [menu setMenuVisible: YES animated: YES];  
  20. }  

這裡的快捷菜單,顯示三個菜單項:剪貼、粘貼、複制:

view plain

  1. - (BOOL)canPerformAction:(SEL)action withSender:(id)sender{  
  2.     if (action == @selector(cut:)) {  
  3.         return ([self selectedView] == imageView) ? YES : NO;  
  4.     } else if (action == @selector(copy:)) {  
  5.         return ([self selectedView] == imageView) ? YES : NO;  
  6.     } else if (action == @selector(paste:)) {  
  7.         return ([self selectedView] == pasteView) ? YES : NO;  
  8.     } else if (action == @selector(select:)) {  
  9.         return NO;  
  10.     } else if (action == @selector(selectAll:)) {  
  11.         return NO;  
  12.     } else {  
  13.         return [super canPerformAction:action withSender:sender];  
  14.     }  
  15. }  
  16. - (void)cut:(id)sender {  
  17.     [self copy:sender];  
  18.     [imageView setHidden:YES];  
  19. }  
  20. - (void)copy:(id)sender {  
  21.     [self placeImageOnPasteboard:[self imageView]];  
  22. }  
  23. - (void)paste:(id)sender {  
  24.     UIPasteboard *appPasteBoard =   
  25.     [UIPasteboard pasteboardWithName:@"CopyPasteImage" create:YES];  
  26.     NSData *data =[appPasteBoard dataForPasteboardType:@"com.marizack.CopyPasteImage.imageView"];  
  27.     pasteView.image = [UIImage imageWithData:data];  
  28. }  

效果:

1、點選圖檔,顯示菜單按鈕。

iOS開發值詳解剪貼闆  

2、點選複制,将資料複制到剪貼闆上:

iOS開發值詳解剪貼闆  

3、點選粘貼,将資料粘貼到uiimageview上。

iOS開發值詳解剪貼闆  

原文連結:http://blog.csdn.net/zhuqilin0/article/details/6661044