当QLPreviewController更改显示的文档时,我有一个需要通知的对象。 QLPreviewController具有属性currentPreviewItemIndex,该属性在文档更改时更新。我已经添加了我的对象作为currentPreviewItemIndex的观察者,它在我的代码中更改了属性时收到通知,到目前为止一切都很好。 问题是用户可以在屏幕上更改显示的文档,我发现在这种情况下不会生成通知。
在这种情况下,收到通知的任何解决方案?我假设当调用属性currentPreviewItemIndex的setter时生成通知,并且可能在用户滑动属性时在对象QLPreviewController内部更改。
另一个解决方案可能是在QLPreviewController中禁用水平滑动但保留垂直滑动(有箭头按钮来更改显示的文档)。你是怎么做到的?
提前感谢您的帮助。
Giannandrea
答案 0 :(得分:1)
在QLPreviewController上创建一个类别并调用适当的方法,并为KVO添加willChange / didChange;)
严肃地说: 我尝试了KVO,它也没有为我工作.. 1)id文件一个苹果的错误,说你需要这个
但作为解决方法
这被称为确定,每次我们刷卡,所以我会“破解”这个以消灭你自己正确的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"];
}
}