2015-05-28 19 views
13

Ich entwickle eine App, die Rich-Text-Editor-Funktion hat. Auf ZSSRichTextEditor habe ich meinen Editor-Code geschrieben. Hier ist mein Editor UIWebView, der von JavaScript-Code injiziert wird, um den Rich-Text-Inhalt zu unterstützen/zu bearbeiten.So implementieren Sie Rückgängig machen/Wiederherstellen in UIWebView

ZSSRichTextEditor hat Rückgängig/Redo-Funktion, aber es entspricht nicht meiner Anforderung. Also fing ich an, das Undo/Redo-Feature selbst zu implementieren.

Nachdem ich UndoManager durchgegangen bin, kam ich zu wissen, dass die Implementierung von Undo/Redo wird nicht so viel Kopfschmerzen sein, wie Apple viel für uns hilft. Wenn wir es an der richtigen Stelle registrieren, kümmert sich UndoManager um alles andere. Aber hier kämpfe ich wie/wo UndoManger für editierbare UIWebView registrieren.

Es gibt so viele Beispiele Undo/Redo in UITextView zu implementieren, aber ich etwas nicht bearbeitet finden UIWebView

Können Sie jemand bitte mir zu diesem Thema führen?

+0

Nur lesen Sie in diesem .. Hoffnung, damit es für Sie [UIWebView mit contentEditable] [1] [1] arbeiten: http://stackoverflow.com/questions/8474386/uiwebview-with- contenteditable-html-Editing-first-Responder-Handling –

+0

Dies wird Ihnen http://stackoverflow.com/questions/8474386/uiwebview-with-contenteditable-html-editing-first-responder-handling –

+1

helfen Durch Schütteln Wenn Sie anrufen, erhalten Sie die Option "Rückgängig/Wiederholen". – sschunara

Antwort

0

Erstellen Sie zunächst zwei Eigenschaften für die Geschichte etwa so:

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

Dann, was ich möchte, ist ZSSRichTextEditor Verwendung Unterklasse tun, so dass Sie delegieren erhalten aufruft, wenn eine Taste gedrückt wird oder eine Aktion durchgeführt wird. Dann auf jedem Delegierten Gespräches können Sie verwenden:

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

Ich würde auch irgendeine Art von FIFO (First in First out) Methode verwenden, um die Größe der Geschichte zu halten, die kleiner als 20 oder 30, so dass Sie nicht tun habe diese verrückten langen Saiten im Gedächtnis. Aber das hängt davon ab, wie lange der Inhalt im Editor ist. Hoffe das alles macht Sinn.

+2

Danke für deine Antwort! Das wird definitiv funktionieren, aber ich glaube, es sollte noch einen besseren Weg geben. Wenn du schaust. " Bei den Apps wie Evernote, OneNote haben sie es sehr gut gehandhabt, ich werde noch einige Tage warten, bis ich die passende Lösung bekomme, sonst werde ich mit diesem Ansatz gehen :-) – thavasidurai

+0

Danke! Ich glaube wirklich, dass dies so ist, wie jemand einen Redo/Undo implementieren würde, weil Sie den Status auf einer Art Stack speichern müssen. Ich bin mir nicht sicher, wie du es sonst tun würdest. Und die tatsächliche Delegate-Methode hängt natürlich von der verwendeten Bibliothek ab – AlexKoren