gpt4 book ai didi

ios - NSTextStorage 的备用后备存储

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:24 26 4
gpt4 key购买 nike

每个示例都将 NSMutableAttributedString 显示为“后备存储”,用于保存与查看/编辑文本相关的文本和属性。我如何使用替代品,例如 std::string 或数据库中的内容。作为测试,我创建了一个子类并将其硬编码为在覆盖所需方法时返回默认值。然而,当我在 iPhone 5 设备上运行它时,它只显示黑屏,直到我按下主页按钮。系统不断调用 attributesAtIndex:location:effectiveRange: range: CPU 使用率上升到 100%,App 什么也没做。它确实调用了 string: 方法一次,但随后一直调用 attributesAtIndex:location:effectiveRange:range

例子:

@implementation MyTextStorage
{
}

- (id)init
{
self = [super init];

if (self)
{
}

return self;
}


#pragma mark - Reading Text

- (NSString *)string
{
return @"Static";
}

- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range
{
return @{NSFontAttributeName: [UIFont fontWithName:@"Noteworthy-Bold" size:36] } ;
}

#pragma mark - Text Editing

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str
{
// Empty - Don't allow editing
}

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range
{
// Empty - Don't allow editing
}

- (void)processEditing
{
[super processEditing];
}




@end

这是它的设置方式:

    // property
self.textStorage = [MyTextStorage new];

// Create layout manager, and attach text storage to layout manager.
NSLayoutManager* layoutManager = [[NSLayoutManager alloc] init];
[self.textStorage addLayoutManager: layoutManager];

// Create text container and attach to layout manager
CGSize size = self.view.bounds.size;
size.height = size.height/2;

NSTextContainer* textContainer = [[NSTextContainer alloc] initWithSize: size];
[layoutManager addTextContainer: textContainer];

// Create text view, given text container.
CGRect frame1 = CGRectMake(0, 20, size.width, size.height);
UITextView *tv1 = [[UITextView alloc] initWithFrame:frame1 textContainer: textContainer];
[self.view addSubview: tv1];

我理解NSTextStorage是一个Class Cluster,这似乎意味着它是一个抽象类工厂。我真的不明白为什么我不能使用另一个“后备商店”。我的计划是使用 std::string (因为我的数据来自哪里的原因)然后返回一个常量属性样式(如上面的代码)。我一直在阅读有关 NSTextStorage、NSLayoutManager、NSTextContainer 和 NSTextView 的所有内容,包括 mac OS X 文档(即使我在 iOS 上这样做)。谢谢!

最佳答案

NSRangePointer 基本上是指向 NSRange 的指针。如果它不为空,则需要在退出方法之前设置它。像这样:

- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range {
if(range != NULL){
range->location = 0;
range->length = self.string.length;
}
return @{NSFontAttributeName: [UIFont fontWithName:@"Noteworthy-Bold" size:36] } ;
}

关于ios - NSTextStorage 的备用后备存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868382/

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