• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - NSTextStorage 的备用后备存储

[复制链接]
菜鸟教程小白 发表于 2022-12-12 19:02:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

每个示例都显示一个 NSMutableAttributedString 作为“后备存储”,用于保存与查看/编辑文本相关的文本和属性。我如何使用替代品,例如 std::string 或者数据库中的内容。作为一个测试,我创建了一个子类并对其进行硬编码,以便在我覆盖所需的方法时返回默认值。但是,当我在 iPhone 5 设备上运行它时,它只会显示黑屏,直到我按下 Home 按钮。系统不断调用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 *)attributesAtIndexNSUInteger)location effectiveRangeNSRangePointer)range
{
    return  @{NSFontAttributeName:  [UIFont fontWithName"Noteworthy-Bold" size:36] } ;
}

#pragma mark - Text Editing

- (void)replaceCharactersInRangeNSRange)range withStringNSString *)str
{
    // Empty - Don't allow editing
}

- (void)setAttributesNSDictionary *)attrs rangeNSRange)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 上这样做)。谢谢!



Best Answer-推荐答案


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

- (NSDictionary *)attributesAtIndexNSUInteger)location effectiveRangeNSRangePointer)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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap