【问题标题】:How can I read uitextview text line by line iOS?如何逐行读取 uitextview 文本 iOS?
【发布时间】:2014-02-01 03:24:56
【问题描述】:

我有带有文本的 uitextview。我想逐行阅读。我希望它适用于 iOS 5 并且没有 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; 委托方法。我该怎么做?

【问题讨论】:

  • 如果行由“\n”分隔,那么您可以按照@Mr_bem 的代码,如果不是并且您正在使用iOS7,那么您可以尝试-santhu 建议。如果不是这种情况,那么您无法以 100% 的准确率阅读每一行中的文本,相信我,我已经尝试了所有方法。如果你能说出你想要达到的目标,我可以提出一些建议。

标签: ios iphone ipad ios5 uitextview


【解决方案1】:

用途:

NSArray *lines = [textView.text componentsSeparatedByString:@"\n"];

你的数组有行,每一行都在一个索引中。

【讨论】:

  • 如果我们使用回车键换行,我们可以使用它。但我想逐行阅读而不输入回车键。
【解决方案2】:

您可以使用 textview 的布局管理器来获取这些内容。但它在 iOS 7 中可用。您可以使用布局管理器的方法 - ( enumerateLineFragmentsForGlyphRange:usingBlock: )

下面的代码打印结果如图所示

textView.text =@"abcdsakabsbdkjflk sadjlkasjdlk asjkdasdklj asdpaandjs bajkhdb hasdskjbnas kdbnkja sbnkasj dbkjasd kjk aj";

NSLog(@"%d",_textView.text.length); // length here is 104.

[_textView.layoutManager enumerateLineFragmentsForGlyphRange:NSMakeRange(0, 104) usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *textContainer, NSRange glyphRange, BOOL *stop) {

NSLog(@"rect %@ - usedRect %@ - glymph Rangle %d %d -",NSStringFromCGRect(rect),NSStringFromCGRect(usedRect),glyphRange.location,glyphRange.length);
    }]
;

打印结果

2013-12-17 12:48:40.250 testEmpty[675:a0b] rect {{0, 0}, {200, 13.8}} - usedRect {{0, 0}, {176.08398, 13.8}} - glymph Rangle 0 31 -
2013-12-17 12:48:40.251 testEmpty[675:a0b] rect {{0, 13.8}, {200, 13.8}} - usedRect {{0, 13.8}, {182.11328, 13.8}} - glymph Rangle 31 31 -
2013-12-17 12:48:40.251 testEmpty[675:a0b] rect {{0, 27.6}, {200, 13.8}} - usedRect {{0, 27.6}, {168.75977, 13.8}} - glymph Rangle 62 28 -
2013-12-17 12:48:40.252 testEmpty[675:a0b] rect {{0, 41.400002}, {200, 13.8}} - usedRect {{0, 41.400002}, {82.035156, 13.8}} - glymph Rangle 90 14 -

因此,在该块的每次运行中,您将获得 glymphRange.length 作为该行中使用的字符串的长度。

【讨论】:

    【解决方案3】:

    扩展@santhu 的答案,这里是 Swift 4 的答案:

    textView.text = "this is some long text, that is one continuous string but is on different lines."
    
    textView.layoutManager.enumerateLineFragments(forGlyphRange: NSRange(location: 0, length: text.count)) { (rect, usedRect, textContainer, glyphRange, stop) in
    
        let characterRange = textView.layoutManager.characterRange(forGlyphRange: glyphRange, actualGlyphRange: nil)
        let line = (textView.text as NSString).substring(with: characterRange)
        print(line)
        print("----------------------------------------------")
    }
    
    print("----------------------------------------------")
    print("----------------------------------------------")
    

    输出:

    this is some long text, t
    ----------------------------------------------
    hat is one continuous str
    ----------------------------------------------
    ing but is on different lin
    ----------------------------------------------
    es.
    ----------------------------------------------
    ----------------------------------------------
    ----------------------------------------------
    

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 2014-06-13
      • 2011-11-02
      • 2015-05-21
      • 2022-11-05
      相关资源
      最近更新 更多