2012-11-07 119 views
5

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

在这种情况下,接收通知的任何解决方案?我猜想,当被称为属性currentPreviewItemIndex的设置者时,可能会在用户刷卡属性在对象QLPreviewController中内部更改时生成通知。

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

在此先感谢您的帮助。

Giannandrea

+0

你喜欢这个问题的任何解决方案?我也面临类似的问题。如果你有解决方案,那么你可以在这里指导吗? – Vijay

回答

1

作出的QLPreviewController类别和调酒适当的方法,要么添加willChange/didChange的志愿;)

虽然严重: 我试图志愿和这对我要么没有工作。 1)标识文件与苹果公司应该是一个错误说你需要这个

但作为一种变通方法

  • (ID)previewPan EL:(QLPreviewPanel *)面板previewItemAtIndex:(NSInteger的)指数{

这就是所谓的确定,每次我们轻扫,所以我会“黑客”这个火你自己的正确的志愿。像

 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。声明一个静态上下文:

static void *changePageContext = &changePageContext; 

// 2。在viewDidLoad中一个强大的裁判的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"]; 
    } 
}