2012-11-07 6 views
5

Ho un oggetto che deve essere notificato quando un QLPreviewController modifica il documento mostrato. QLPreviewController ha la proprietà currentPreviewItemIndex che viene aggiornata quando il documento cambia. Ho aggiunto il mio oggetto come observer per currentPreviewItemIndex e riceve la notifica quando nel mio codice viene modificata la proprietà, finora tutto bene. Il problema è che l'utente può cambiare il documento mostrato scorrendo sullo schermo e ho scoperto che in questo caso la notifica non viene generata.Osservazione valore-chiave per QLPreviewController.currentPreviewItemIndex

Qualsiasi soluzione per ricevere la notifica anche in questo caso? Suppongo che la notifica venga generata quando viene chiamato il setter della proprietà currentPreviewItemIndex e probabilmente quando l'utente fa scorrere la proprietà viene modificata internamente nell'oggetto QLPreviewController.

Un'altra soluzione potrebbe essere quella di disabilitare lo scorrimento orizzontale in QLPreviewController ma preservare lo scorrimento verticale (ci sono i pulsanti freccia per modificare il documento visualizzato). Come si fa a farlo?

Grazie in anticipo per l'aiuto.

Giannandrea

+0

Hai qualche soluzione per questo problema? Ho anche affrontato un problema simile. Se hai una soluzione, puoi per favore guidare qui? – Vijay

risposta

1

fanno una categoria a QLPreviewController e swizzle il metodo appropriato e aggiungere l'willChange/didChange per KVO;)

sul serio però: ho provato KVO e non ha funzionato per me. . 1) file id un bug con la mela per dire che avete bisogno di questo

ma come una soluzione alternativa

  • (id) previewPan EL: (QLPreviewPanel *) Pannello previewItemAtIndex: (NSInteger) index {

questo è chiamato ok e ogni volta che passare il dito quindi vorrei 'hackerare' questo a fuoco il proprio corretto KVO. qualcosa come

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

ho scritto in linea qui così ci sono tenuti ad essere errori di battitura e gli errori, ma penso che l'approccio generale potrebbe funzionare.

1

// 1. Dichiarare un contesto statico:

static void *changePageContext = &changePageContext; 

// 2. In viewDidLoad aggiungi sé come osservatore currentPreviewItemIndex proprietà di un forte ref al QLPreviewController:

[self.previewController addObserver:self forKeyPath:@"currentPreviewItemIndex" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:changePageContext]; 

// 3. Implementare il metodo Observer:

-(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. Rimuovere l'osservatore in vista WillDisappear:

-(void)viewWillDisappear:(BOOL)animated 
{ 
    if (![[self.navigationController viewControllers] containsObject: self]) 
    { 
     [self.previewController removeObserver:self forKeyPath:@"currentPreviewItemIndex"]; 
    } 
} 
Problemi correlati