gpt4 book ai didi

ios - 逐字符向 NSMutableAttributedString 添加属性

转载 作者:可可西里 更新时间:2023-11-01 06:20:53 27 4
gpt4 key购买 nike

这是我的情况:

我有一个 NSMutableAttributedString 在 TextView 中没有属性。每当用户按下退格键时,我不想删除一个字符,我希望它被删除,就像生产力套件的“跟踪更改”功能一样。我希望用户在那之后能够继续正常输入。我是这样开始的:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (text.length == 0 && textView.text.length == 0) return YES;

if (text.length == 0 && !([[textView.text substringFromIndex:textView.text.length - 1] isEqualToString:@" "] || [[textView.text substringFromIndex:textView.text.length - 1] isEqualToString:@"\n"])) {

textView.attributedText = [self strikeText:textView.attributedText];

textView.selectedRange = NSMakeRange(textView.attributedText.length - 1, 0);

return NO;
}
return YES;
}

- (NSAttributedString *)strikeText:(NSAttributedString *)text
{
NSRange range;
NSMutableAttributedString *returnValue = [[NSMutableAttributedString alloc] initWithAttributedString:text];

if (![text attribute:NSStrikethroughStyleAttributeName atIndex:text.length - 1 effectiveRange:&range]) {
NSLog(@"%@", NSStringFromRange(range));
NSLog(@"%@", [text attribute:NSStrikethroughStyleAttributeName atIndex:text.length - 1 effectiveRange:&range]);

[returnValue addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(text.length - 1, 1)];
[returnValue addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(text.length - 1, 1)];
}
else {
[returnValue addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(range.location - 1, 1)];
[returnValue addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(range.location - 1, 1)];
}

[returnValue removeAttribute:NSStrikethroughStyleAttributeName range:NSMakeRange(returnValue.length, 1)];

return returnValue;


}

然而,无论我怎么想,我都无法解决这个问题。此代码不起作用,或部分起作用。 attribute: atIndex: effectiveRange: 返回的值始终为 nil,与该属性是否实际存在无关。有效范围超出了我所拥有的文本范围。

请帮帮我。

最佳答案

在您的 strikeText: 方法中,您只检查 attributedString 的最后。如果你想检查最后一个字符,你应该从 text.length -2 中检查,假设文本足够长。另外,您在方法末尾的 removeAttribute 对我来说也没有多大意义。

关于如何重用委托(delegate)协议(protocol)范围以仅删除所需字符的简单方法:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
// check if your replacement is going to be empty, therefor deleting
if ([text length] == 0) {

// don't strike spaces and newlines, could use NSCharacterSet here
NSString *textToDelete = [textView.text substringWithRange:range];
if (![@[ @" ", @"\n" ] containsObject:textToDelete]) {
textView.attributedText = [self textByStrikingText:textView.attributedText inRange:range];
}

textView.selectedRange = NSMakeRange(range.location, 0);

return NO;
}

return YES;
}

- (NSAttributedString *)textByStrikingText:(NSAttributedString *)text inRange:(NSRange)range
{
NSMutableAttributedString *strickenText = [[NSMutableAttributedString alloc] initWithAttributedString:text];

[strickenText addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:range];
[strickenText addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];

return strickenText;
}

可能会有更多边缘情况,但这是一种可以满足您要求的简单方法。

关于ios - 逐字符向 NSMutableAttributedString 添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259491/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com