【问题标题】:Trim last two lines of an attributed string修剪属性字符串的最后两行
【发布时间】:2020-12-17 19:11:58
【问题描述】:

如何删除这个 NSAttributedString 的最后两行?

NSString *exampleString = @"line 1\nline 2\nline 3\nline 4"
NSAttributedString *as = [NSAttributedString alloc] int];
[as setString:exampleString];
[self removeLastTwoLinesOfAttributedString:as];
NSLog(@"%@",as);

-(void)removeLastTwoLinesOfAttributedString:(NSAttributedString *)string {
   //some code here
}

我想在这个例子中以 @"line 1\nline 2" 结尾。谢谢

【问题讨论】:

    标签: ios objective-c nsattributedstring


    【解决方案1】:

    你可以这样做:

     -(NSAttributedString *) removeLastTwoLinesOfAttributedString:(NSAttributedString *aString) {
       NSRange range = [aString.string rangeOfString:@"\n" options:NSBackwardsSearch];
       range = [aString.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, range.location)];
       return [aString attributedSubstringFromRange:NSMakeRange(0, range.location)];
    }
    
    int main (int argc, const char * argv[])
    {
        NSString *exampleString = @"line 1\nline 2\nline 3\nline 4";
        NSAttributedString *as = [[NSAttributedString alloc] initWithString:exampleString];
        as = [self removeLastTwoLinesOfAttributedString:as];
        NSLog(@"%@",as);
        return 0;
    }
    

    输出

    line 1
    line 2
    

    【讨论】:

      【解决方案2】:

      我建议最好的解决方案:

      -(NSAttributedString *)removeLastTwoLinesOfAttributedString:(NSAttributedString *)aString {
      
          if (aString.length == 0) {
              return aString
          }
      
          NSString *string = [aString string];
      
          unsigned numberOfLines, index, stringLength = [string length];
          NSRange rangeOfLastTwoLines = NSMakeRange(aString.length - 1, 0);
      
          for (index = stringLength-1, numberOfLines = 0; index >= 0 && numberOfLines < 2; numberOfLines++) {
              NSRange rangeOfLine = [string lineRangeForRange:NSMakeRange(index, 0)];
              rangeOfLastTwoLines = NSUnionRange(rangeOfLastTwoLines, rangeOfLine);
              index -= rangeOfLine.length;
          }
      
          return [aString attributedSubstringFromRange:NSMakeRange(0, rangeOfLastTwoLines.location)];
      }
      

      这具有处理任何换行符的好处,而不仅仅是“\n”,它使用 Apple 首选的方法来检测行,请参阅 this

      如果最后两行小于 2 也不会中断

      【讨论】:

        【解决方案3】:

        如果你使用 Swift,你可以这样做,如果你使用 Objective-C,你应该看看其他答案。

        您可以像这样删除String 的最后两行

        string.components(separatedBy: "\n").dropLast(2).joined(separator: "\n")
        

        要对属性字符串执行此操作,只需访问 string 属性,删除最后两行,然后使用修剪后的字符串和所有相同的属性创建一个属性字符串。

        【讨论】:

        • 请根据问题中的标签提供 Objective-C 版本。
        • @koen 哎呀,我错过了。我添加了免责声明,因为已经有其他 ObjC 答案。
        猜你喜欢
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多