5

QLPreviewController が表示されたドキュメントを変更したときに通知する必要があるオブジェクトがあります。QLPreviewController には、ドキュメントが変更されたときに更新されるプロパティ currentPreviewItemIndex があります。オブジェクトを currentPreviewItemIndex のオブザーバーとして追加しましたが、コードでプロパティが変更されたときに通知を受け取ります。問題は、ユーザーが画面をスワイプして表示されているドキュメントを変更できることです。この場合、通知が生成されないことがわかりました。

この場合も通知を受け取る解決策はありますか? プロパティcurrentPreviewItemIndexのセッターが呼び出されたときに通知が生成され、おそらくユーザーがプロパティをスワイプすると、オブジェクトQLPreviewControllerで内部的に変更されると思います。

別の解決策として、QLPreviewController で水平方向のスワイプを無効にし、垂直方向のスワイプを維持することもできます (表示されるドキュメントを変更するための矢印ボタンがあります)。どうやってそれをしますか?

助けてくれてありがとう。

ジャンナンドレア

4

2 に答える 2

1

QLPreviewController でカテゴリを作成し、適切なメソッドをスウィズルして、KVO の willChange/didChange を追加します ;)

真剣に:私はKVOを試しましたが、どちらもうまくいきませんでした..

しかし、回避策として

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

これはOKと呼ばれ、スワイプするたびにこれを「ハック」して、独自の正しい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 で、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 に答える