如何在UIWebView中实现undo/redo
How to implement undo/redo in UIWebView
我正在开发一个具有富文本编辑器功能的应用程序。在 ZSSRichTextEditor 之上,我已经编写了我的编辑器代码。这里我的编辑器是 UIWebView,它将通过 javascript 代码注入到 support/edit 富文本内容。
ZSSRichTextEditor 具有 undo/redo 功能,但不符合我的要求。所以我开始自己实现 undo/redo 功能。
在我完成 UndoManager 之后,我开始知道实施 undo/redo 不会那么令人头疼,因为 Apple 对我们有很大帮助。如果我们在适当的地方注册它,那么 UndoManager
将处理所有其他事情。但在这里我正在努力 how/where 注册 UndoManger
用于可编辑 UIWebView
.
在 UITextView
中有很多实施 undo/redo 的示例,但我没有找到任何可编辑的 UIWebView
你能指导我吗?
首先,像这样为历史创建两个属性:
@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(先进先出)方法来保持历史记录的大小小于 20 或 30,这样您就不会在内存中有这些疯狂的长字符串。但这取决于您,具体取决于内容在编辑器中的时长。希望这一切都有意义。
我正在开发一个具有富文本编辑器功能的应用程序。在 ZSSRichTextEditor 之上,我已经编写了我的编辑器代码。这里我的编辑器是 UIWebView,它将通过 javascript 代码注入到 support/edit 富文本内容。
ZSSRichTextEditor 具有 undo/redo 功能,但不符合我的要求。所以我开始自己实现 undo/redo 功能。
在我完成 UndoManager 之后,我开始知道实施 undo/redo 不会那么令人头疼,因为 Apple 对我们有很大帮助。如果我们在适当的地方注册它,那么 UndoManager
将处理所有其他事情。但在这里我正在努力 how/where 注册 UndoManger
用于可编辑 UIWebView
.
在 UITextView
中有很多实施 undo/redo 的示例,但我没有找到任何可编辑的 UIWebView
你能指导我吗?
首先,像这样为历史创建两个属性:
@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(先进先出)方法来保持历史记录的大小小于 20 或 30,这样您就不会在内存中有这些疯狂的长字符串。但这取决于您,具体取决于内容在编辑器中的时长。希望这一切都有意义。