iOS开发中APP之间传递信息2--UIPasteboard

可以看一下以下UIPasteboard的用法 

-(void)writeValueInAppOne
{
UIPasteboard *myUIPasteboard = [UIPasteboard generalPasteboard];
printf("myUIPasteboard.string %s\n", [myUIPasteboard.string UTF8String]); 

myUIPasteboard.string = myLabel.text;
} 

-(void)getValueInAppTwo
{
UIPasteboard *myUIPasteboard = [UIPasteboard generalPasteboard];
printf("myUIPasteboard.string %s\n", [myUIPasteboard.string UTF8String]); 

myTextField.text = myUIPasteboard.string;
}

2.  详细的用法:http://blog.csdn.net/zhangao0086/article/details/7580654  (转)

有时候我们可能需要复制UILabel上的文本,或者UIImageView的图片,而UILabel和UIImageView默认是不响应Touch事件的,也无法复制,那么我们就需要自己实现一个可复制的UILabel。新添加一个类继承自UILabel:




  1. @interface UICopyLabel : UILabel
  2. @end


  1. #import "UICopyLabel.h"
  2. @implementation UICopyLabel
  3. @end


为了能接收到事件(能成为第一响应者),我们需要覆盖一个方法:




  1. -(BOOL)canBecomeFirstResponder{
  2. return YES;
  3. }
还需要针对复制的操作覆盖两个方法:



  1. //"反馈"关心的功能
  2. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  3. return (action == @selector(copy:));
  4. }
  5. //针对于copy的实现
  6. -(void)copy:(id)sender{
  7. UIPasteboard *pboard = [UIPasteboard generalPasteboard];
  8. pboard.string = self.text;
  9. }
有了以上三个方法,我们就能处理copy了,当然,在能接收到事件的情况下:
  1. //UILabel默认是不接收事件的,我们需要自己添加touch事件
  2. -(void)attachTapHandler{
  3. self.userInteractionEnabled = YES;  //用户交互的总开关
  4. UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
  5. touch.numberOfTapsRequired = 2;
  6. [self addGestureRecognizer:touch];
  7. [touch release];
  8. }
  9. //绑定事件
  10. - (id)initWithFrame:(CGRect)frame
  11. {
  12. self = [super initWithFrame:frame];
  13. if (self) {
  14. [self attachTapHandler];
  15. }
  16. return self;
  17. }
  18. //同上
  19. -(void)awakeFromNib{
  20. [super awakeFromNib];
  21. [self attachTapHandler];
  22. }


我们已经可以接收到事件了!由于我在上方将tap数设为2,所以需要双击才能捕获,接下来,我们需要处理这个tap,以便让菜单栏弹出来:




  1. -(void)handleTap:(UIGestureRecognizer*) recognizer{
  2. [self becomeFirstResponder];
  3. UIMenuController *menu = [UIMenuController sharedMenuController];
  4. [menu setTargetRect:self.frame inView:self.superview];
  5. [menu setMenuVisible:YES animated:YES];
  6. }

这样一来,一个可复制的UILabel就诞生了!它能处理接收点击、弹出菜单栏、处理copy,这是一个很普通的可复制控件。

-----------------------------------------猥琐的分界线-----------------------------------------


接下来我们做一个可复制的UIImageView,创建一个新的viewController,放两个imageView,默认显示不同的图:



然后把上面的代码直接拷过来,改三个地方:




  1. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  2. return (action == @selector(copy:) || action == @selector(paste:));
  3. }
  4. -(void)copy:(id)sender{
  5. UIPasteboard *pboard = [UIPasteboard generalPasteboard];
  6. pboard.image = self.image;
  7. }
  8. -(void)paste:(id)sender{
  9. UIPasteboard *pboard = [UIPasteboard generalPasteboard];
  10. self.image = pboard.image;
  11. }
-----------------------------------------猥琐的分界线-----------------------------------------UIPasteboard不仅可以在应用程序内通信,还能在应用程序间通信,你应该已经见到过了,比如我复制一个url,然后打开safari,粘贴到地址栏去,而我们可以在应用程序间“悄悄”的通信、共享数据。

注:这里的“悄悄”只是说其他的应用程序不知道,而系统是允许的。


我们用模板Single View Application来创建两个简单的工程,一个叫PasteBoardWrite,另一个叫PasteBoardRead,界面分别如下:


     


在PasteBoardWrite里面点“写入”后把textField中的文本写入粘贴板,然后切换到PasteBoardRead的时候显示出来。如果我们的粘贴板只想给“自己人”用的话,就不能用系统的通用粘贴板,需要我们自己创建一个:




  1. //需要提供一个唯一的名字,一般使用倒写的域名:com.mycompany.myapp.pboard
  2. //后面的参数表示,如果不存在,是否创建一个
  3. UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];
使用这个粘贴板,我们可以把文本存进去,然后在另一个app里面读出来,一些常用的类型已经被设置为属性了:


除此之外,如果是能够转换成plist的数据类型(NSString, NSArray, NSDictionary, NSDate, NSNumber 和 NSURL),我们可以调用setValue:forPasteboardType:方法去存储数据,其他类型只能调用setData:forPasteboardType:方法(plist数据类型也可使用),类似于这样:




  1. NSDictionary *dict = [NSDictionary dictionaryWithObject:textField.text forKey:@"content"];
  2. NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];
  3. [pb setData:dictData forPasteboardType:@"myType"];
获取就类似于这样:



  1. UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];
  2. NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:[pb dataForPasteboardType:@"myType"]];
  3. caption.text = [dict objectForKey:@"content"];


上面提到了一个PasteboardType,这是一个统一类型标识符(Uniform Type Identifier  UTI),能帮助app获取自己能处理的数据。比如你只能处理文本的粘贴,那给你一个UIImage显然是无用的。你可以使用公用的UTI,也可以使用任意字符,苹果建议使用倒写的域名加上类型名:com.myCompany.myApp.myType。


用自己创建的粘贴板,能只在你的本地应用之间通信,有时候它能让你的用户体验变得更好,比如微信就是这么做的。


UPDATED:


iOS7修改了UIPasteboard的部分设计。


这此之前,你只要知道任何一个UIPasteboard的Name,就能访问其中的内容,而现在,只有在同一CFBundleIdentifier标识下的App才能共享内容,如com.mycompany.a和com.mycompany.b,它们的com.mycompany部分是一样的,就能共享。

				
时间: 2024-10-12 16:49:30

iOS开发中APP之间传递信息2--UIPasteboard的相关文章

iOS开发中APP之间传递信息1--URL Schema(应用程序间互相启动)

原文:http://blog.sina.com.cn/s/blog_8a6c97b5010162f0.html 受限与iOS系统的运行机制,绝大多数情况下一个应用在进入后台后会马上进入suspend或terminate状态,也就是说不能执行代码,iOS中也没有类似WIndows中Service的概念,但存在某些例外: 1:有某些重要的任务,例如保存用户数据,网络下载等,可以申请一段时间的background运行时间,但时间段内能进行的操作比较有限,且有时间限制,长度为600秒左右. 2:某些特定

分分钟解决iOS开发中App启动广告的功能

前不久有朋友需要一个启动广告的功能,我说网上有挺多的,他说,看的不是很理想.想让我写一个,于是乎,抽空写了一个,代码通俗易懂,简单的封装了一下,各种事件用block回调的,有俩种样式的广告,一种是全屏广告,另一种是下面露logo的,类似网页新闻的启动广告.依赖SDWebImage主要用来下载网络的广告图片,一般项目里面网络图片都用的这个框架,所以在此不做过多的阐述.下面让我们来看看我封装的过程,对于新手来说,可以学习一下这种封装的思想. 1.首先建一个继承View的LBLaunchImageAd

ios开发中APP底部上滑不能调出如WiFi、蓝牙、播放等的设置页面的解决的方法

在开发的APP中我们通常通过手动底部上滑来调出WiFi.蓝牙.飞行模式等的设置页面.有时我们开发的APP无法调出. 解决的方法: 进入iPhone "设置" --> "控制中心"--> "程序内訪问"开关打开就可以! "再锁定屏幕上訪问"  是在锁屏情况下,同意调用设置

iOS开发中常用的轮子 第四篇 收集齐7个轮子,准备高仿部分微博APP页面

产品原因有几张页面会参考微博APP来做,先收集齐轮子:计划这周完成,然后放到github上开源. 1,微博流刷新: 2,浏览微博中的图片: 3,发布微博: 4,发微博时选择照片: ============分割线:具体如下 ============= 选择相册中图片: 1,UzysAssetsPickerController 链接:https://github.com/uzysjung/UzysAssetsPickerController 介绍:用于替换UIImagePickerControlle

iOS开发中视图控制器ViewControllers之间的数据传递

iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storyboard中传递数据. 首先新建一个空工程,并添加一个根视图控制器类,如下图所示: # 在函数didFinishLunchingWithOption中添加几行代码,完成后如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 - (BOOL)application:(UIApplication

在iOS开发中,经常需要调用其它App,如拨打电话、发送邮件等。UIApplication:openURL:方法是实现这一目的的 ##转

源地址:http://blog.csdn.net/lengshengren/article/details/16339409 在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的url参数的模式来调用不同的App. 通过openURL方法可以调用如下应用: 调用谷歌地图(Google Maps) 调用邮件客户端(Apple Mail) 拨号(Phone Number) 调用短信(SMS)

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器. RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它. 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点. ROM(read only memory):存储性内存,可以掉电存储,例如

iOS开发中MVC、MVVM模式详解

iOS中的MVC(Model-View-Controller)将软件系统分为Model.View.Controller三部分 Model: 你的应用本质上是什么(但不是它的展示方式) Controller:你的Model怎样展示给用户(UI逻辑) View:用户看到的,被Controller操纵着的 Controller可以直接访问Model,也可以直接控制View. 但Model和View不能互相通信. View可以通过action-target的方式访问Controller,比如我们在Sto

ios开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

               在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文本框内容的创建.修改,退出后台,再重新回到后台,来认识这两种持久化数据的方式.效果图如下[图1]: [图1 GUI界面效果图] [本次开发环境: Xcode:7.2     iOS Simulator:iphone6S plus   By:啊左]     一.数据库SQL