QLPreviewController使用方法

在iOS SDK包括了QLPreviewControllerAPI在[iOS]中用于方便预览文件,它支持的文件有:

  • iWork文档
  • 微软Office97以上版本的文档
  • RTF文档
  • PDF文件
  • 图片文件
  • 文本文件和CSV文件

使用的时候首先要引用#import#import <QuickLook/QuickLook.h>
QLPreviewController类似于Tableview的使用方法,也是首先遵循代理和数据源代理。然后实现代理方法,<QLPreviewControllerDataSource,QLPreviewControllerDelegate>
我返回的PreviewItems的数量为1,就是一次加载一个文件,这里可以是多个文件的数组个数,也就是某个本地路径下的多个文件,但是return 不能直接写等于1 ,这样会没有效果,应该写self.arr.count;大家可以自己实现下。

-(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{
    return 1;
}

返回的当前预览的文件QLPreviewItem,controller:当前预览控制器,index:当前预览的第几个文件。

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx{
    ContractDetailModel *modelNew = _arr[idx];
    return [NSURL fileURLWithPath:[self getApplicationDocumentsDirectory:modelNew]];
}

这里为什么返回Url呢,进入QLPreviewItem头文件你就会明白了:

QL_EXPORT @protocol QLPreviewItem <NSObject>
@required
/*!
 * @abstract The URL of the item to preview.
 * @discussion The URL must be a file URL. 
 */
@property(readonly, nonnull, nonatomic) NSURL * previewItemURL;
@optional
/*!
 * @abstract The item's title this will be used as apparent item title.
 * @discussion The title replaces the default item display name. This property is optional.
 */
@property(readonly, nullable, nonatomic) NSString * previewItemTitle;
@end
/*!
 * @abstract This category makes NSURL instances as suitable items for the Preview Controller.
 */
@interface NSURL (QLPreviewConvenienceAdditions) <QLPreviewItem>

QLPreviewControlle其他的一些方法

/*!
 * @abstract Returns YES if QLPreviewController can display this preview item.摘要返回YES如果QLPreviewController能显示预览项目。
 */
+ (BOOL)canPreviewItem:(id <QLPreviewItem>)item;

/*
 * Acessing the previewed items*数据预览项目
 */

/*!
 * @abstract The Preview Panel data source.抽象预览面板数据源。
 */
@property(nonatomic, weak, nullable) id <QLPreviewControllerDataSource> dataSource;

/*!
 * @abstract Asks the Preview Controller to reload its data from its data source.抽象要求预览控制器从其数据源重新加载数据。
 * @discussion This method does not refresh the visible item if it has not changed.刷新可见项,。
 */
- (void)reloadData;

/*!
 * @abstract Asks the Preview Controller to recompute the preview of the currently previewed item.刷新当前预览项目。
 */
- (void)refreshCurrentPreviewItem;

/*!
 * @abstract The index of the currently previewed item in the preview panel or NSNotFound if there is none.当前预览项目的下标。
 */
@property NSInteger currentPreviewItemIndex;

/*!
 * @abstract The currently previewed item in the preview panel or nil if there is none.当前预览项目。
 */
@property(readonly, nullable) id <QLPreviewItem> currentPreviewItem;

监听滑到的是第几个浏览项目,做出相应的操作
如下是改变了title

[self.previewController addObserver:self forKeyPath:@"currentPreviewItemIndex" options:
     NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
//keyPath:属性名称
//object:被观察的对象
//change:变化前后的值都存储在 change 字典中
//context:注册观察者时,context 传过来的值
/* 2.只要object的keyPath属性发生变化,就会调用此回调方法,进行相应的处理:UI更新:*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                       change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    
    // 判断是否为self.myKVO的属性“num”:
    if([keyPath isEqualToString:@"currentPreviewItemIndex"] && object == self.previewController) {
        // 响应变化处理:UI更新(label文本改变)
        
        NSString *num = [NSString stringWithFormat:@"%@",
                           [change valueForKey:@"new"]];
        NSInteger number = [num integerValue];
        ContractDetailModel *model = _arr[number];
        if ([model.agreementType isEqualToString:@"0"] ) {
            self.title = @"title1";
        } else if ([model.agreementType isEqualToString:@"1"]){
            self.title = @"title2";
        }
        if ([num isEqualToString:@"0"]) {
            [self.firstImg setImage:[UIImage imageNamed:@"Oval91"]];
            [self.secsonImg setImage:[UIImage imageNamed:@"Oval92"]];
            
        } else if ([num isEqualToString:@"1"]) {
            [self.firstImg setImage:[UIImage imageNamed:@"Oval92"]];
            [self.secsonImg setImage:[UIImage imageNamed:@"Oval91"]];
        }
        //change的使用:上文注册时,枚举为2个,因此可以提取change字典中的新、旧值的这两个方法
        NSLog(@"\\noldnum:%@ newnum:%@",[change valueForKey:@"old"],
              [change valueForKey:@"new"]);
    }
}

刚刚接触这块,如有错误,也请指出,谢谢!

推荐阅读更多精彩内容

  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 12,633评论 1 175
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    挣奶粉的打工人阅读 19,096评论 8 176
  • 李志成口述,青年琴人计划整理 李志成,青年笛箫演奏家、“中原笛派”传人、笛乐大师孔建华先生嫡传弟子、现任湖北师范大...
    琴人计划阅读 351评论 0 0
  • 最喜欢看小孩的画。有个同学家儿子的画我一直默默看,超喜欢超羡慕。最羡慕小孩脑子里的世界。最想回到孩童时代天马行空的...
    呶呶的简书阅读 154评论 0 0
  • 2017.9.28 星期四 晴 下午接儿子放学时,被他的班主任老师留下来了,告诉我朱田豪把他的同学手弄伤了,我...
    TianHao妈妈阅读 43评论 0 1
  • 文‖减猴 秦淮旧闻 沿河听曲 摇船观舞 夜不兴归 乐哉乐哉
    减猴阅读 163评论 0 3
  • 还有一天过年 管它以前过过多少年,年来了,依然一本正经地准备,好像不如此,时间就会像钟停摆一样凝固,走不进下一个年...
    小森_b811阅读 89评论 0 0