Подтвердить что ты не робот

Как реализовать отмену/повтор в UIWebView

Я разрабатываю приложение, которое имеет богатый текстовый редактор. В верхней части ZSSRichTextEditor Я написал свой код редактора. Здесь мой редактор - UIWebView, который будет впрыскиваться кодом javascript для поддержки/редактирования богатого текстового содержимого.

ZSSRichTextEditor имеет функцию отмены/повтора, но это не соответствует моему требованию. Поэтому я начал реализовывать функцию отмены/повтора по собственному усмотрению.

После того, как я прошел UndoManager, я узнал, что реализация undo/redo не будет такой большой головной болью, поскольку Apple помогает нам. Если мы зарегистрируем его в надлежащем месте, тогда UndoManager позаботится обо всем остальном. Но здесь я борюсь за то, как/где регистрировать UndoManger для редактируемого UIWebView.

Есть так много примеров для реализации undo/redo в UITextView, но я не нахожу ничего для редактируемого UIWebView

Можете ли вы кого-нибудь известить меня об этом?

4b9b3361

Ответ 1

Сначала создайте два свойства для истории:

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

Тогда то, что я хотел бы сделать, это использовать подкласс ZSSRichTextEditor, чтобы вы получили вызовы делегата при нажатии клавиши или действии. Затем при каждом вызове делегата вы можете использовать:

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

Я бы также использовал какой-то метод FIFO (First in First out), чтобы сохранить размер истории меньше 20 или 30, чтобы у вас не было этих сумасшедших длинных строк в памяти. Но это зависит от того, как долго контент находится в редакторе. Надеюсь, что все это имеет смысл.