2015-05-28 17 views
13

Sto sviluppando un'applicazione con funzionalità di editor di testo avanzato. Sopra ZSSRichTextEditor ho scritto il mio codice editor. Qui il mio editor è UIWebView che verrà iniettato dal codice javascript per supportare/modificare il contenuto del testo.Come implementare l'annullamento/ripristino in UIWebView

ZSSRichTextEditor ha funzione di annullamento/ripetizione, ma non è conforme al mio requisito. Così ho iniziato a implementare funzionalità di annullamento/ripetizione per conto proprio.

Dopo aver passato il periodo UndoManager, sono venuto a sapere che l'implementazione di undo/redo non sarà un problema così pesante come Apple ci aiuta molto. Se lo registriamo al posto giusto, lo UndoManager si prenderà cura di tutto il resto. Ma qui sto lottando su come/dove registrare UndoManger per modificabile UIWebView.

Ci sono tanti esempi per attuare undo/redo in UITextView ma non trovo niente per modificabile UIWebView

Può qualcuno per favore mi guida su questo?

+0

Basta controllare questo .. spero che funzionerà per voi [UIWebView con contentEditable] [1] [1]: http://stackoverflow.com/questions/8474386/uiwebview-with- contenteditable-html-editing-prima-responder di gestione –

+0

Questo vi aiuterà a http://stackoverflow.com/questions/8474386/uiwebview-with-contenteditable-html-editing-first-responder-handling –

+1

agitando il telefono verrà visualizzato l'opzione Annulla/Ripristina. – sschunara

risposta

0

In primo luogo, creare due proprietà per la storia in questo modo:

@property (nonatomic, strong) NSMutableArray *history; 
@property (nonatomic) NSInteger currentIndex; 

Poi quello che vorrei fare è utilizzare sottoclasse ZSSRichTextEditor in modo da ottenere delegato chiama quando si preme un tasto o si fa l'azione. Poi su ogni chiamata delegato, è possibile utilizzare:

- (void)delegateMethod { 
    //get the current html 
    NSString *html = [self.editor getHTML]; 
    //we've added to the history 
    self.currentIndex++; 
    //add the html to the history 
    [self.history insertObject:html atIndex:currentIndex]; 
    //remove any of the redos because we've created a new branch from our history 
    self.history = [NSMutableArray arrayWithArray:[self.history subarrayWithRange:NSMakeRange(0, self.currentIndex + 1)]]; 
} 

- (void)redo { 
    //can't redo if there are no newer operations 
    if (self.currentIndex >= self.history.count) 
     return; 
    //move forward one 
    self.currentIndex++; 
    [self.editor setHTML:[self.history objectAtIndex:self.currentIndex]]; 
} 

- (void)undo { 
    //can't undo if at the beginning of history 
    if (self.currentIndex <= 0) 
     return; 
    //go back one 
    self.currentIndex--; 
    [self.editor setHTML:[self.history objectAtIndex:self.currentIndex]]; 
} 

Vorrei anche utilizzare una sorta di FIFO (First In First Out) metodo per mantenere la dimensione della storia minore di 20 o 30 in modo che non si avere in memoria queste lunghe stringhe folli. Ma dipende da te a seconda di quanto tempo il contenuto è nell'editor. Spero che tutto ciò abbia un senso.

+2

Grazie per la tua risposta, sicuramente funzionerà, ma credo che ci dovrebbe essere un altro modo migliore per farlo. nelle app come Evernote, OneNote l'hanno gestito molto bene, aspetterò ancora qualche giorno per ottenere la soluzione appropriata altrimenti andrò con questo approccio :-) – thavasidurai

+0

Grazie! Penso davvero che questo è il modo in cui qualcuno dovrebbe implementare un redo/undo perché è necessario salvare lo stato su una sorta di stack. Non sono sicuro di come potresti farlo. E il metodo del delegato effettivo si basa, ovviamente, sulla libreria che stai utilizzando – AlexKoren