ios 剪贴板

    剪贴板为操作系统提供了一块集中存放数据的区域,使得应用程序之间可以共享数据。用户可以在某个程序里复制一份数据,然后切换到其他程序,将那份数据黏贴到那个程序里。大部分操作系统里面都有与剪切、复制、粘贴操作类似的功能。此外,用户也可以在同一个应用程序内部的文本框与视图之间复制并粘贴数据,而开发者则可以创建应用程序专用的剪贴板,它里面存放的数据,其他程序无法解读。

    UIPasteboard类可以访问设备共用的剪贴板及其中的内容。下面的这行代码可以返回通用的系统剪贴板,绝大部分复制、粘贴操作都可以在它上面执行:

UIPasteboard *pb = [UIPasteboard generalPasteboard];

    有系统所提供的通用剪贴板和搜索剪贴板是设备上所有程序共用的。除了这些共享的系统剪贴板之外,iOS还提供了应用程序专用的剪贴板,以及带有自定义名称的剪贴板,同一个组织里共用同一个团队ID的应用程序开发者,可以在不同的应用程序之间使用这些剪贴板。pasteboardWithUniqueName方法可以创建应用程序专用的剪贴板,该方法所返回的剪贴板对象,会一直延续到应用程序退出时为止。

    pasteboardWithName:create:方法用来创建共享的剪贴板,该方法会返回具备指定名称的剪贴板。create参数的意思是:如果系统里没有这一剪贴板,那么是否应该新建它。创建好剪贴板后,如果把persistent属性设为YES,那它就可以在程序运行完毕后继续保留其数据了。

1、存储数据

    剪贴板中可以存放一项或多项数据。剪贴板中的每项数据,都可以表示成一份包含若干键值对的字典,键值对里存放有数据及其类型。剪贴板里的某项数据,可以含有多份与之相关的条目,以便使其他程序能够找到他们所兼容的数据类型。我们常用UTI来表示数据类型。比方说,可以用pulic.text类型来存放文本数据,可以用public.url类型来保存URL地址,或是用public.jpeg类型来存放图像数据。这都是iOS程序常用的数据类型。

    UIPasteboard提供了一些方法,有的可以处理一个剪贴板条目,有的可以处理多个剪贴板条目,另外还有一些方法用于获取和设置剪贴板数据,以及查询剪贴板中的数据类型。处理单个剪贴板数据所用的那些方法,其中有很多处理都是剪贴板里的首个条目。开发者可以经由items属性获取包含全部条目的数组。

    开发者可以给剪贴板中的首个条目赋予一个NSData对象以及一个描述数据类型的UTI,以便把该条目的数据同类型关联起来:

[[UIPasteboard generalPasteboard] setData:theData forPasteboardType:theUTI];


    另外,对于属性列表的对象来说,可以通过setValue:forPasteboardType:方法把他们放到剪贴板中。这些属性列表的对象的内部存储方式与等效的原始数据不同,这体现了setValue:forPasteboardType:方法与setData:forPasteboardType:方法之间的区别。

2、存储常见类型的数据

    剪贴板为某些数据类型提供了专门的方法,这些数据类型表示几种最常见使用的剪贴板条目。他们是:颜色、图像、字符串及URL。UIPasteboard类提供了专用的设置器与获取器,使得开发者可以更加方便的处理这种数据类型。我们可以将其当成剪贴板的属性,直接以”.“写法来设置并获取他们。另外,每个属性都有一种对应的复数形式,这使得开发者可以经由对象数组来操作它们。

    上面提到的这些剪贴板属性,极大的简化了向系统剪贴板里放置常用数据时所需编写的代码。可供使用的属性有下面这些:

    1、string——把剪贴板中的首个条目当成字符串来设置获取。

    2、strings——把剪贴板中的所有条目当成字符串数组来设置或获取。

    3、image——把剪贴板中的首个条目当成图像来设置或获取。

    4、images——把剪贴板中的所有条目当成图像数组来设置或获取。

    5、URL——把剪贴板中的首个条目当成URL来设置或获取。

    6、URLs——把剪贴板中的所有条目当成URL数组来设置或获取。

    7、color——把剪贴板中的首个条目当成颜色对象来设置或获取

    8、colors——把剪贴板中的所有条目当成颜色对象数组来设置或获取。

3、获取数据

    如果要获取的数据属于前一节所提到的四种类型,那么只需要使用相关的属性即可将其从剪贴板里取出来。否则,需要用dataForPasteboardType:方法来获取。该方法只会返回剪贴板第一个条目里的数据,而忽略剪贴板中的其他条目。

    要想获取与某些类型相符的所有数据,需要调用itemSetWithPasteboardType:方法,并在返回的NSIndexSet上面遍历,以访问其中的每个字典。然后通过字典里的键和值来查明该条目所含的数据类型及数据内容。

    当剪贴板中的数据有变化时,他会发出UIPasteboardChangeNotification通知,开发者可以通过NSNotificationCenter中默认的那些方法来添加监听器,以便监听此通知。另外,也可以监听UIPasteboardRemovedNotification,以便在某 条目移除剪贴板时得到通知。

4、自动更新剪贴板

    坦率的说,iOS的选取与复制界面,并不是整个操作系统里最简洁的UI元件。有时候,为了简化用户的操作流程,我们会把可能要与其他应用程序分享的那些内容提前准备好。

    用户在文本视图里面输入并编辑文本的时候,程序会自动把文本更新到剪贴板。如果enbleWatcher变量处于启用状态,那么每次编辑文本时,程序都会把文本更新到剪贴板。

- (void)updatePastedboard
{
    if (enableWatcher) {
        [UIPasteboard generalPasteboard].string = textView.text;
    }
}

- (void)textViewDidChange:(UITextView *)textView
{
    [self updatePastedboard];
    
}

- (void)toggle:(UIBarButtonItem *)bbi
{
    enableWatcher = !enableWatcher;
    bbi.title  enableWatcher ? @"Stop Watching" : @"Watch";
}

你可能感兴趣的:(iOS)