QLPreviewController.currentPreviewItemIndex的键值观察

时间:2012-11-07 13:24:44

标签: objective-c io uikit key-value-observing

当QLPreviewController更改显示的文档时,我有一个需要通知的对象。 QLPreviewController具有属性currentPreviewItemIndex,该属性在文档更改时更新。我已经添加了我的对象作为currentPreviewItemIndex的观察者,它在我的代码中更改了属性时收到通知,到目前为止一切都很好。 问题是用户可以在屏幕上更改显示的文档,我发现在这种情况下不会生成通知。

在这种情况下,收到通知的任何解决方案?我假设当调用属性currentPreviewItemIndex的setter时生成通知,并且可能在用户滑动属性时在对象QLPreviewController内部更改。

另一个解决方案可能是在QLPreviewController中禁用水平滑动但保留垂直滑动(有箭头按钮来更改显示的文档)。你是怎么做到的?

提前感谢您的帮助。

Giannandrea

2 个答案:

答案 0 :(得分:1)

在QLPreviewController上创建一个类别并调用适当的方法,并为KVO添加willChange / didChange;)

严肃地说: 我尝试了KVO,它也没有为我工作.. 1)id文件一个苹果的错误,说你需要这个

但作为解决方法

  • (id)previewPanel:(QLPreviewPanel *)panel previewItemAtIndex:(NSInteger)index {

这被称为确定,每次我们刷卡,所以我会“破解”这个以消灭你自己正确的KVO。

之类的东西
     static NSInteger oldIndex = -1; //reset when the panel is hidden or shown
     int newIndex = qlController.displayedIndex;
     if(oldIndex != newIndex) {
         oldIndex = newIndex;
         [qlController willChangeValueForKey:@"displayedIndex"];
         [qlController didChangeValueForKey:@"displayedIndex"];
     }

我在这里写了内联,所以一定会出现错别字和错误,但我认为一般方法可行。

答案 1 :(得分:1)

// 1。声明一个静态上下文:

static void *changePageContext = &changePageContext;

// 2。在viewDidLoad中,将self作为强查法的currentPreviewItemIndex属性的观察者添加到你的QLPreviewController:

[self.previewController addObserver:self forKeyPath:@"currentPreviewItemIndex" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:changePageContext];

// 3。实现观察者方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context
{
    if (context == changePageContext)
    {
        NSLog(@"newValue:%ld",(long)self.previewController.currentPreviewItemIndex);
    }
    else
    {
        // Any unrecognized context must belong to super
        [super observeValueForKeyPath:keyPath
                             ofObject:object
                               change:change
                              context:context];
    }
}

// 4。删除viewWillDisappear中的观察者:

-(void)viewWillDisappear:(BOOL)animated
{
    if (![[self.navigationController viewControllers] containsObject: self])
    {
        [self.previewController removeObserver:self forKeyPath:@"currentPreviewItemIndex"];
    }
}