私はUITextView
書式設定ツールバーを持っています。「太字」ボタンを押すと、テキスト/選択が変更され、操作がテキスト ビューの に登録されますNSUndoManager
。
元に戻そうとするrestoreText:
と、アプリを強制終了するまで何度も呼び出されます
サンプルコード:
- (void)bold {
NSRange range = self.textView.selectedRange;
NSRange oldRange = range;
NSString *oldText = self.textView.text;
NSString *selection = [self.textView.text substringWithRange:range];
self.textView.scrollEnabled = NO;
self.textView.text = [self.textView.text stringByReplacingCharactersInRange:range
withString:[NSString stringWithFormat:@"<b>%@</b>", selection]];
self.textView.scrollEnabled = YES;
if (range.length == 0) { // If nothing was selected
range.location += 3; // Place selection between tags
} else {
range.location += range.length + 7; // Place selection after tag
range.length = 0;
}
self.textView.selectedRange = range;
[[self.textView.undoManager prepareWithInvocationTarget:self] restoreText:oldText withRange:oldRange];
[self.textView.undoManager setActionName:@"bold"];
}
- (void)restoreText:(NSString *)text withRange:(NSRange)range {
NSLog(@"restoreText:%@ %@",text, [NSNumber numberWithBool:[self.textView.undoManager isUndoing]]);
NSString *oldText = self.textView.text;
NSRange oldRange = self.textView.selectedRange;
self.textView.scrollEnabled = NO;
self.textView.text = text;
self.textView.scrollEnabled = YES;
self.textView.selectedRange = range;
[[self.textView.undoManager prepareWithInvocationTarget:self] restoreText:oldText withRange:oldRange];
}
そしてコンソール:
2012-10-04 18:10:14.207 undotest[8861:c07] restoreText: 1
2012-10-04 18:10:14.633 undotest[8861:c07] restoreText:<b></b> 0
2012-10-04 18:10:15.117 undotest[8861:c07] restoreText: 0
2012-10-04 18:10:15.589 undotest[8861:c07] restoreText:<b></b> 0
2012-10-04 18:10:16.017 undotest[8861:c07] restoreText: 0
2012-10-04 18:10:16.557 undotest[8861:c07] restoreText:<b></b> 0
[self.textView.undoManager isUndoing]
で呼び出しを登録する前にチェックしようとしましrestoreText:withRange:
たが、クラッシュします:
2012-10-04 18:10:49.297 undotest[8904:c07] restoreText: 1
2012-10-04 18:10:53.412 undotest[8904:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '_endUndoGroupRemovingIfEmpty:: WebThreadSafeUndoManager 0x76551e0 is in invalid state, endUndoGrouping called with no matching begin
'
このコードは iOS5 では機能していましたが、iOS6 では機能しなくなりました。Apple にバグを報告しましたが、何か問題があるかどうかわかりません