5

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

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

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

在此先感谢您的帮助。

詹南德里亚

4

2 回答 2

1

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

不过说真的:我尝试了 KVO,但它对我也不起作用.. 1) 向苹果提交了一个错误,说明你需要这个

但作为一种解决方法

  • (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"];
     }

我在这里内联写了它,所以肯定会有错别字和错误,但我认为一般方法可以工作。

于 2012-11-07T16:01:17.547 回答
1

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

static void *changePageContext = &changePageContext;

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

[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"];
    }
}
于 2016-09-25T11:21:56.077 回答