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:来创建。

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

例子:

1、复制剪贴文本。

    下面通过一个例子,可以在tableview上显示一个快捷菜单,上面只有复制按钮,复制tableview上的数据之后,然后粘贴到title上。

定义一个单元格类CopyTableViewCell,在这个类的上显示快捷菜单,实现复制功能。

@interface CopyTableViewCell : UITableViewCell {
iddelegate;
}
@property (nonatomic, retain)
iddelegate;
@end

实现CopyTableViewCell :

复制代码
#import"CopyTableViewCell.h"

@implementation CopyTableViewCell

@synthesizedelegate;

- (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;
}
elseif(action == @selector(copy:)){
return YES;
}
elseif(action == @selector(paste:)){
return NO;
}
elseif(action == @selector(select:)){
return NO;
}
elseif(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
{
return1;
}

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

// 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;
}
复制代码

效果:

复制一行数据:

点击右上角的按钮粘贴,将数据显示在title上:

2、图片复制粘贴

   下面通过一个例子,将图片复制和剪贴到另外一个UIImageView中间。

1、在界面上放置两个uiimageview,一个是图片的数据源,一个是将图片粘贴到的地方。CopyPasteImageViewController 代码如下:

复制代码
@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];
}
elseif([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;
}
elseif (action == @selector(copy:)) {
return ([self selectedView] == imageView) ? YES : NO;
}
elseif (action == @selector(paste:)) {
return ([self selectedView] == pasteView) ? YES : NO;
}
elseif (action == @selector(select:)) {
return NO;
}
elseif (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上。

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





本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2011/08/04/2127883.html,如需转载请自行联系原作者

相关文章
|
27天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
4天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
85 66
|
14天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
18天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
20天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
23天前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
28天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
29 2
|
1月前
|
vr&ar Android开发 iOS开发
安卓与iOS开发中的用户界面设计原则
【10月更文挑战第41天】探索移动应用开发的精髓,本文将深入分析安卓和iOS平台上用户界面设计的核心原则。通过比较两大操作系统的设计哲学,我们将揭示如何打造直观、易用且美观的应用程序界面。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在竞争激烈的应用市场中脱颖而出。
|
1月前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
1月前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。