zoukankan      html  css  js  c++  java
  • 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部分是一样的,就能共享。


  • 相关阅读:
    Swift入门篇-Hello World
    Swift入门篇-swift简介
    Minecraft 插件 world edit 的cs 命令
    搭建本地MAVEN NEXUS 服务
    MC java 远程调试 plugin 开发
    企业内部从零开始安装docker hadoop 提纲
    javascript 命令方式 测试例子
    ca des key crt scr
    JSF 抽象和实现例子 (函数和属性)
    form 上传 html 代码
  • 原文地址:https://www.cnblogs.com/KingQiangzi/p/3998756.html
Copyright © 2011-2022 走看看