iOS oc-剪切板

2020-04-27 作者:编程知识要点   |   浏览(75)

1.应用范围

iOS在某些特定时刻需要把内容重一个app拷贝到另一个app 这时候我们就可以使用剪切板UIPasteboard

在iOS中,UITextField、UITextView和UIWebView等都有复制粘贴等功能。而其她控件却没有集成这些方便操作的功能。下面我将通过对粘贴板UIPasteboard这个类来详细说明在iOS中粘贴板的使用方法。

一、自带剪切板操作的原生UI控件

2、iOS自带剪切板操作的原生UI控件

在iOS中下面三个控件,自身就有复制-粘贴的功能: 、UITextView 、UITextField 、UIWebView

参考链接UIPasteboard类有3个初始化方法,如下:

在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField、UITextView与UIWebView。在这些控件的文字交互处进行长按手势可以在屏幕视图上唤出系统的剪切板控件,用户可以进行复制、粘贴,剪切等操作

3、系统的剪切板UIPasteboard

UIPasteboard类有3个初始化方法:

//获取系统级别的剪切板+ (UIPasteboard *)generalPasteboard;//获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:create;//获取一个应用内可用的剪切板+ (UIPasteboard *)pasteboardWithUniqueName;

上面3个初始化方法,分别获取或创建3个级别不同的剪切板,系统级别的剪切板在整个设备中共享,即是应用程序被删掉,其向系统级的剪切板中写入的数据依然在。自定义的剪切板通过一个特定的名称字符串进行创建,它在应用程序内或者同一开发者开发的其他应用程序中可以进行数据共享。第3个方法创建的剪切板等价为使用第2个方法创建的剪切板,只是其名称字符串为nil,它通常用于当前应用内部。

注意:使用第3个方法创建的剪切板默认是不进行数据持久化的,及当应用程序退出后,剪切板中内容将别抹去。若要实现持久化,需要设置persistent属性为YES。

//剪切板的名称@property(readonly,nonatomic) NSString *name;//根据名称删除一个剪切板+ removePasteboardWithName:(NSString *)pasteboardName;//是否进行持久化@property(getter=isPersistent,nonatomic) BOOL persistent;//此剪切板的改变次数 系统级别的剪切板只有当设备重新启动时 这个值才会清零@property(readonly,nonatomic) NSInteger changeCount;

下面这些方法用于设置与获取剪切板中的数据:最新一组数据对象的存取:

//获取剪切板中最新数据的类型- (NSArray<NSString> *)pasteboardTypes;//获取剪切板中最新数据对象是否包含某一类型的数据- containsPasteboardTypes:(NSArray<NSString> *)pasteboardTypes;//将剪切板中最新数据对象某一类型的数据取出- (nullable NSData *)dataForPasteboardType:(NSString *)pasteboardType;//将剪切板中最新数据对象某一类型的值取出- (nullable id)valueForPasteboardType:(NSString *)pasteboardType;//为剪切板中最新数据对应的某一数据类型设置值- setValue:value forPasteboardType:(NSString *)pasteboardType;//为剪切板中最新数据对应的某一数据类型设置数据- setData:data forPasteboardType:(NSString *)pasteboardType;

多组数据对象的存取:

//数据组数@property(readonly,nonatomic) NSInteger numberOfItems;//获取一组数据对象包含的数据类型- (nullable NSArray *)pasteboardTypesForItemSet:(nullable NSIndexSet*)itemSet;//获取一组数据对象中是否包含某些数据类型- containsPasteboardTypes:(NSArray<NSString> *)pasteboardTypes inItemSet:(nullable NSIndexSet *)itemSet;//根据数据类型获取一组数据对象- (nullable NSIndexSet *)itemSetWithPasteboardTypes:(NSArray *)pasteboardTypes;//根据数据类型获取一组数据的值- (nullable NSArray *)valuesForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;//根据数据类型获取一组数据的NSData数据- (nullable NSArray *)dataForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;//所有数据对象@property(nonatomic,copy) NSArray *items;//添加一组数据对象- addItems:(NSArray<NSDictionary> *> *)items;

上面方法中很多需要传入数据类型参数,这些参数是系统定义好的一些字符窜,如下:

//所有字符串类型数据的类型定义字符串数组UIKIT_EXTERN NSArray<NSString> *UIPasteboardTypeListString;//所有URL类型数据的类型定义字符串数组UIKIT_EXTERN NSArray<NSString> *UIPasteboardTypeListURL;//所有图片数据的类型定义字符串数据UIKIT_EXTERN NSArray<NSString> *UIPasteboardTypeListImage;//所有颜色数据的类型定义字符串数组UIKIT_EXTERN NSArray<NSString> *UIPasteboardTypeListColor;

相比于上面两组方法,下面这些方法更加面向对象,在开发中使用更加方便与快捷:

//获取或设置剪切板中的字符串数据@property(nullable,nonatomic,copy) NSString *string;//获取或设置剪切板中的字符串数组@property(nullable,nonatomic,copy) NSArray<NSString> *strings;//获取或设置剪切板中的URL数据@property(nullable,nonatomic,copy) NSURL *URL;//获取或设置剪切板中的URL数组@property(nullable,nonatomic,copy) NSArray<NSURL> *URLs;//获取或s何止剪切板中的图片数据@property(nullable,nonatomic,copy) UIImage *image;//获取或设置剪切板中的图片数组@property(nullable,nonatomic,copy) NSArray<UIImage> *images;//获取或设置剪切板中的颜色数据@property(nullable,nonatomic,copy) UIColor *color;//获取或设置剪切板中的颜色数组@property(nullable,nonatomic,copy) NSArray<UIColor> *colors;

对剪切板的某些操作会触发如下通知:

UIKIT_EXTERN NSString *const UIPasteboardChangedNotification;//剪切板数据类型键值增加时发送的通知UIKIT_EXTERN NSString *const UIPasteboardChangedTypesAddedKey;//剪切板数据类型键值移除时发送的通知UIKIT_EXTERN NSString *const UIPasteboardChangedTypesRemovedKey;//剪切板被删除时发送的通知UIKIT_EXTERN NSString *const UIPasteboardRemovedNotification;
//获取系统级别的剪切板+ (UIPasteboard *)generalPasteboard;//获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:create;//获取一个应用内可用的剪切板+ (UIPasteboard *)pasteboardWithUniqueName;

上面3个初始化方法,分别获取或创建3个级别不同的剪切板,下面我们详解一下在什么情况下用哪种初始化方法

二、系统的剪切板管理类UIPasteboard

+ (UIPasteboard *)generalPasteboard;系统级别的剪切板在整个设备中共享,即是应用程序被删掉,其向系统级的剪切板中写入的数据依然在。

实际上,当用户通过上面的空间进行复制、剪切等操作时,被选中的内容会被存放到系统的剪切板中,并且这个剪切板并不只能存放字符串数据,其还可以进行图片数据与网址URL数据的存放。这个剪切板就是UIPasteboard类,开发者也可以直接通过它来操作数据进行应用内或应用间传值。

+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:create;自定义的剪切板通过一个特定的名称字符串进行创建,它在应用程序内或者同一开发者开发的其他应用程序中可以进行数据共享。举个例子:比如你开发了多款应用,用户全部下载了,在A应用中用户拷贝了一些数据(为了数据安全,不用系统级别的Pasteboard),在打开B应用时就会自动识别,提高用户体验。

UIPasteboard类有3个初始化方法,如下:

+ (UIPasteboard *)pasteboardWithUniqueName;第3个方法创建的剪切板等价为使用第2个方法创建的剪切板,只是其名称字符串为nil,它通常用于当前应用内部。(当然也可以跨应用使用,但必须Bundle Identifier 例com.maoshaoqian.** 星号前部一样)


注意:使用第3个方法创建的剪切板默认是不进行数据持久化的,及当应用程序退出后,剪切板中内容将别抹去。若要实现持久化,需要设置persistent属性为YES。

//获取系统级别的剪切板

下面我们来看一下UIPasteboard的常用属性

+ (UIPasteboard *)generalPasteboard;

//剪切板的名称@property(readonly,nonatomic) NSString *name;//根据名称删除一个剪切板+ removePasteboardWithName:(NSString *)pasteboardName;//是否进行持久化@property(getter=isPersistent,nonatomic) BOOL persistent;//此剪切板的改变次数 系统级别的剪切板只有当设备重新启动时 这个值才会清零@property(readonly,nonatomic) NSInteger changeCount;

//获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建

UIPasteboard数据类型判断及其存取

+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;

//获取剪切板中最新数据的类型- (NSArray<NSString *> *)pasteboardTypes;//获取剪切板中最新数据对象是否包含某一类型的数据- containsPasteboardTypes:(NSArray<NSString *> *)pasteboardTypes;//将剪切板中最新数据对象某一类型的数据取出- (nullable NSData *)dataForPasteboardType:(NSString *)pasteboardType;//将剪切板中最新数据对象某一类型的值取出- (nullable id)valueForPasteboardType:(NSString *)pasteboardType;//为剪切板中最新数据对应的某一数据类型设置值- setValue:value forPasteboardType:(NSString *)pasteboardType;//为剪切板中最新数据对应的某一数据类型设置数据- setData:data forPasteboardType:(NSString *)pasteboardType;

//获取一个应用内可用的剪切板

多组数据对象的存取:

+ (UIPasteboard *)pasteboardWithUniqueName;

//数据组数@property(readonly,nonatomic) NSInteger numberOfItems;//获取一组数据对象包含的数据类型- (nullable NSArray *)pasteboardTypesForItemSet:(nullable NSIndexSet*)itemSet;//获取一组数据对象中是否包含某些数据类型- containsPasteboardTypes:(NSArray<NSString *> *)pasteboardTypes inItemSet:(nullable NSIndexSet *)itemSet;//根据数据类型获取一组数据对象- (nullable NSIndexSet *)itemSetWithPasteboardTypes:(NSArray *)pasteboardTypes;//根据数据类型获取一组数据的值- (nullable NSArray *)valuesForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;//根据数据类型获取一组数据的NSData数据- (nullable NSArray *)dataForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;//所有数据对象@property(nonatomic,copy) NSArray *items;//添加一组数据对象- addItems:(NSArray<NSDictionary<NSString *, id> *> *)items;

上面方法中很多需要传入数据类型参数,这些参数是系统定义好的一些字符窜,如下:

上面3个初始化方法,分别获取或创建3个级别不同的剪切板,系统级别的剪切板在整个设备中共享,即是应用程序被删掉,其向系统级的剪切板中写入的数据依然在。自定义的剪切板通过一个特定的名称字符串进行创建,它在应用程序内或者同一开发者开发的其他应用程序中可以进行数据共享。第3个方法创建的剪切板等价为使用第2个方法创建的剪切板,只是其名称字符串为nil,它通常用于当前应用内部。

//所有字符串类型数据的类型定义字符串数组UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListString;//所有URL类型数据的类型定义字符串数组UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListURL;//所有图片数据的类型定义字符串数据UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListImage;//所有颜色数据的类型定义字符串数组UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListColor;

注意:使用第3个方法创建的剪切板默认是不进行数据持久化的,及当应用程序退出后,剪切板中内容将别抹去。若要实现持久化,需要设置persistent属性为YES。

相比于上面两组方法,下面这些方法更加面向对象,在开发中使用更加方便与快捷:


//获取或设置剪切板中的字符串数据@property(nullable,nonatomic,copy) NSString *string;//获取或设置剪切板中的字符串数组@property(nullable,nonatomic,copy) NSArray<NSString *> *strings;//获取或设置剪切板中的URL数据@property(nullable,nonatomic,copy) NSURL *URL;//获取或设置剪切板中的URL数组@property(nullable,nonatomic,copy) NSArray<NSURL *> *URLs;//获取或s何止剪切板中的图片数据@property(nullable,nonatomic,copy) UIImage *image;//获取或设置剪切板中的图片数组@property(nullable,nonatomic,copy) NSArray<UIImage *> *images;//获取或设置剪切板中的颜色数据@property(nullable,nonatomic,copy) UIColor *color;//获取或设置剪切板中的颜色数组@property(nullable,nonatomic,copy) NSArray<UIColor *> *colors;//部分代码参考- canBecomeFirstResponder { return YES;}- canPerformAction:action withSender:sender { //action 会返回很多,想用哪个就写那个(action == @selector return (action == @selector || action == @selector;}-copy:sender{ UIPasteboard* pasteboard = [UIPasteboard generalPasteboard]; [pasteboard setImage:self.image]; if ([self.delegate respondsToSelector:@selector(transSomeTing:)]) { [self.delegate transSomeTing:pasteboard.image]; NSLog(@"%@",self.image); } NSLog(@"您点击的是拷贝%@",pasteboard.items);}-paste:sender{ UIPasteboard* pasteboard = [UIPasteboard generalPasteboard]; UIImage *image = [pasteboard image]; if  { self.image = image; } NSLog(@"您点击的是粘贴");}- cut:sender { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; [pasteboard setImage:self.image]; NSLog(@"您点击的是剪切");}- select:sender { NSLog(@"您点击的是选择");}-selectAll:sender { NSLog(@"您点击的是全选");}

UIPasteboard中常用方法及属性如下:

对剪切板的某些操作会触发如下通知:

//剪切板的名称

//剪切板内容发生变化时发送的通知UIKIT_EXTERN NSString *const UIPasteboardChangedNotification;//剪切板数据类型键值增加时发送的通知UIKIT_EXTERN NSString *const UIPasteboardChangedTypesAddedKey;//剪切板数据类型键值移除时发送的通知UIKIT_EXTERN NSString *const UIPasteboardChangedTypesRemovedKey;//剪切板被删除时发送的通知UIKIT_EXTERN NSString *const UIPasteboardRemovedNotification;//使用举例//当剪切板被删除时,监听通知,可处理相应事件;[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerWillHide) name:UIPasteboardRemovedNotification object:nil];

@property(readonly,nonatomic) NSString *name;

我们以系统粘贴板+ (UIPasteboard *)generalPasteboard;来举例子我们给UIImageView添加复制粘贴事件

//根据名称删除一个剪切板

//// ViewController.m// Practice_UIPasteboard//// Created by 毛韶谦 on 2016/12/13.// Copyright © 2016年 毛韶谦. All rights reserved.//#import "ViewController.h"#import "PasteboardLabel.h"#import "PasteboardImageView.h"#import <MobileCoreServices/MobileCoreServices.h>@interface ViewController ()<transSometing>@property (strong, nonatomic) IBOutlet PasteboardImageView *leftImageView;@end@implementation ViewController- viewDidLoad { [super viewDidLoad]; self.leftLabel.userInteractionEnabled = YES;//用于监听 UIMenuController的变化 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerWillShow) name:UIMenuControllerWillShowMenuNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerWillHide) name:UIMenuControllerWillHideMenuNotification object:nil]; // Do any additional setup after loading the view, typically from a nib.}- longPressGestureAction:(UILongPressGestureRecognizer *)sender { //要将图片变为第一响应者,而且要把图片设为**可交换状态** [self.leftImageView becomeFirstResponder]; self.leftImageView.userInteractionEnabled = YES; self.leftImageView.delegate = self; UIMenuController *menuController = [UIMenuController sharedMenuController]; [menuController setTargetRect:self.leftImageView.frame inView:self.view]; [menuController setMenuVisible:YES animated:YES]; }}

// PasteboardImageView.m// Practice_UIPasteboard//// Created by 毛韶谦 on 2016/12/13.// Copyright © 2016年 毛韶谦. All rights reserved.//#import "PasteboardImageView.h"@implementation PasteboardImageView//这个方法不能少- canBecomeFirstResponder { return YES;}- canPerformAction:action withSender:sender { return (action == @selector || action == @selector;}-copy:sender{ UIPasteboard* pasteboard = [UIPasteboard generalPasteboard]; [pasteboard setImage:self.image]; if ([self.delegate respondsToSelector:@selector(transSomeTing:)]) { [self.delegate transSomeTing:pasteboard.image]; NSLog(@"%@",self.image); } NSLog(@"您点击的是拷贝%@",pasteboard.items);}-paste:sender{ UIPasteboard* pasteboard = [UIPasteboard generalPasteboard]; UIImage *image = [pasteboard image]; if  { self.image = image; } NSLog(@"您点击的是粘贴");}/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- drawRect:rect { // Drawing code}*/@end

+ (void)removePasteboardWithName:(NSString *)pasteboardName;

还有UILabel的具体用法,代码链接中有

//是否进行持久化

如有疑问,欢迎扫码交流或者留言

@property(getter=isPersistent,nonatomic) BOOL persistent;

图片 1qrcode_for_gh_66ad36353006_430.jpg

//此剪切板的改变次数 系统级别的剪切板只有当设备重新启动时 这个值才会清零

如果感觉有用

本文由永利官网发布于编程知识要点,转载请注明出处:iOS oc-剪切板

关键词: