iOS開発_iPhoneでクリップボード操作を実現_iPhoneコピー貼り付け機能


iOSでは、クリップボードを使用してアプリケーション内およびアプリケーション間でデータの共有を実現できます.例えば、iPhone QQからurlをコピーし、safariブラウザに貼り付けてこのリンクの内容を表示することができます.
一、iOSの次の3つのコントロールには、コピー-貼り付け機能があります.
1、UITextView 2、UITextField 3、UIWebView
二、UImit frameworkはいくつかのクラスとプロトコルを提供して、私たちが自分のアプリケーションでクリップボードの機能を実現するのに便利です.
1、UIpasteboard:私たちはその中にデータを書き込むことができて、データを読み取ることができます
2、UImenuControl:選択した項目をコピー、クリップ、貼り付けするためのショートカットメニューが表示されます.
3、UIresponderのcanPerformAction:withSender:ショートカットメニューに表示されるコマンドを制御します.
4、ショートカットメニューのコマンドをクリックすると、UIresponderStandardEditActionsが呼び出されます.
三、次の項目はクリップボードに置くことができます.
1、UIPasteboardTypeListString —  kUTTypeUTF 8 PlainText 2、UIpasteboardTypeListURLを含む文字列配列-   kUTTypeURL 3、UITAsteboardTypeListImageを含むURL配列-   kUTTypePNGとkUTTypeJPEG 4、UIpasteboardTypeListColorを含むグラフィック配列   カラー配列
四、クリップボードの種類は二つに分けられます.
≪システム・レベル|System Level|oem_src≫:UIPasteboardNameGeneralおよびUIPasteboardNameFindを使用して作成します.システム・レベルのクリップボードは、アプリケーションがシャットダウンされたり、アンインストールされたりしてもデータが失われません.
≪アプリケーション・レベル|Application Level|emdw≫:設定すると、アプリケーションが閉じた後もクリップボードにデータを保存できますが、アプリケーションがアンインストールされるとデータが失われます.pasteboardWithName:create:で作成できます.
これらを理解したら、アプリケーションでクリップボードを使用する方法を一連の例で説明します.
例:
1、クリップテキストをコピーします.
    次の例では、ボタンのみをコピーし、tableviewのデータをコピーしてtitleに貼り付けるtableviewにショートカットメニューを表示します.
セルクラスCopyTableViewセルを定義し、このクラスにショートカットメニューを表示し、レプリケーション機能を実現します.
@interface CopyTableViewCell : UITableViewCell {     
	id delegate; 
} 
@property (nonatomic, retain) id delegate; 
@end
//Copy Table Viewセルの :
#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
 
//  CopyPasteTextController,      。
@interface CopyPasteTextController : UIViewController<UITableViewDelegate> {     
	//                 
	BOOL menuVisible;     
	UITableView *tableView; 
}  
@property (nonatomic, getter=isMenuVisible) BOOL menuVisible;  
@property (nonatomic, retain) IBOutlet UITableView *tableView; 
@end 
CopyPasteTextControllerの :
#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; 
}
:
1 のデータをコピーするには、 の に います.
のボタンをクリックして り け、titleにデータを します.
2、 のコピーと り け
   の では、 のUIImageViewの に をコピーしてクリップします.
1、インタフェースに2つのuiimageviewを し、1つは のデータソースであり、1つは を り ける である.CopyPasteImageViewControlコードは のとおりです.
@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
2、 をタッチすると、ショートカットメニューが されます.
- (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]; 
}

       ,       :  、  、  :
- (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]; }
:
1、 をクリックして、メニューボタンを します.
2、コピーをクリックして、クリップボードにデータをコピーする:
3、 り けをクリックし、uiimageviewにデータを り けます.