【问题标题】:Key-value observing for QLPreviewController.currentPreviewItemIndexQLPreviewController.currentPreviewItemIndex 的键值观察
【发布时间】:2012-11-07 13:24:43
【问题描述】:

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

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

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

提前感谢您的帮助。

詹南德里亚

【问题讨论】:

  • 你有什么解决这个问题的方法吗?我也面临类似的问题。如果您有解决方案,可以请您在这里指导吗?

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


【解决方案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"];
     }

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多