每个示例都将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是一个类集群,这似乎意味着它是一个抽象类工厂。我真的不明白为什么我不能使用另一个“后备商店”。我的计划是使用std :: string(因为我的数据来自何处),然后返回一个常量属性样式(如上面的代码中所示)。我一直在阅读有关NSTextStorage,NSLayoutManager,NSTextContainer和NSTextView的所有内容,包括mac OS X文档(即使我在iOS上这样做)。谢谢!
答案 0 :(得分:1)
NSRangePointer
基本上是指向NSRange
的指针。
如果它不为null,则需要在退出方法之前设置它。像这样:
- (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] } ;
}