UITextView撤消管理器不适用于替换属性字符串(iOS 6)

时间:2012-09-19 19:26:59

标签: uitextview ios6 nsundomanager

iOS 6已经更新为使用UITextView进行富文本编辑(UITextView现在可以获得属性文本属性 - 这是非常不可变的 - )。这是在NDA下的iOS 6 Apple论坛上提出的一个问题,可以公开,因为iOS 6现已公开...

在UITextView中,我可以撤消任何字体更改,但无法撤消视图属性字符串副本中的替换。使用此代码时......

- (void) replace: (NSAttributedString*) old with: (NSAttributedString*) new

{
1.    [[myView.undoManager prepareWithInvocationTarget:self] replace:new with:old];
2.    old=new;

}

...撤消工作正常。

但是如果我添加一行来在我的视图中看到结果,则undoManager不会触发“replace:with:”方法,因为它应该...

- (void) replace: (NSAttributedString*) old with: (NSAttributedString*) new

{
1.    [[myView.undoManager prepareWithInvocationTarget:self] replace:new with:old];
2.    old=new;
3.    myView.attributedText=[[NSAttributedString alloc] initWithAttributedString:old];

}

有什么想法吗?我有任何替换方法的问题,使用范围与否,对于MutableAttributedString,我试图在“2”线上使用......

2 个答案:

答案 0 :(得分:1)

嗯,哇,我真的没想到这个有效!我找不到解决方案,所以我开始尝试任何事情......

- (void)applyAttributesToSelection:(NSDictionary*)attributes {
    UITextView *textView = self.contentCell.textView;

    NSRange selectedRange = textView.selectedRange;
    UITextRange *selectedTextRange = textView.selectedTextRange;
    NSAttributedString *selectedText = [textView.textStorage attributedSubstringFromRange:selectedRange];

    [textView.undoManager beginUndoGrouping];
    [textView replaceRange:selectedTextRange withText:selectedText.string];
    [textView.textStorage addAttributes:attributes range:selectedRange];
    [textView.undoManager endUndoGrouping];

    [textView setTypingAttributes:attributes];
}

答案 1 :(得分:0)

在设置“text”或“attributedText”属性后重置撤消管理器,这就是它无效的原因。无论这种行为是错误还是设计,我都不知道。

但是,您可以使用UITextInput协议方法。

  • (void)replaceRange:(UITextRange *)range withText:(NSString *)text

这很有效。