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


    可以看一下以下UIPasteboard的用法 
    
    -(void)writeValueInAppOne 
    { 
    UIPasteboard *myUIPasteboard = [UIPasteboard generalPasteboard]; 
    printf("myUIPasteboard.string %s
    ", [myUIPasteboard.string UTF8String]); 
    
    myUIPasteboard.string = myLabel.text; 
    } 
    
    -(void)getValueInAppTwo 
    { 
    UIPasteboard *myUIPasteboard = [UIPasteboard generalPasteboard]; 
    printf("myUIPasteboard.string %s
    ", [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.   
    3. @end  
    
    
    1. #import "UICopyLabel.h"  
    2.   
    3. @implementation UICopyLabel  
    4.   
    5. @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.   
    5. -(void)copy:(id)sender{  
    6.     UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
    7.     pboard.image = self.image;  
    8. }  
    9.   
    10. -(void)paste:(id)sender{  
    11.     UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
    12.     self.image = pboard.image;  
    13. }  
    
    -----------------------------------------猥琐的分界线-----------------------------------------
    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部分是一样的,就能共享。


  • 相关阅读:
    算法分析设计实践——相容问题
    算法分析设计实践——最长公共子序列
    算法分析设计实践——矩阵链乘法
    Rotate Columns (easy version) CodeForces
    Save the Nature CodeForces
    Similar Arrays CodeForces
    算法分析设计实践——投资问题
    皇后问题(BFS解法)
    Git的基本使用
    在阿里云服务器上部署ssm项目
  • 原文地址:https://www.cnblogs.com/KingQiangzi/p/3998756.html
Copyright © 2020-2023  润新知