【问题标题】:Truncate Substring from middle for NSString从中间截断 NSString 的子字符串
【发布时间】:2014-11-25 07:57:10
【问题描述】:

我们如何从中间截断来自 NSString 的子字符串 假设,我有 NSString NSString *str = @"2014 年 11 月 25 日星期四 /Shared/Documents/Drawing/c" 我想从中间截断路径字符串并在标签上显示。为此我在标签上使用 NSStrinbuteString

NSString *path = @"/Shared/Documents/Drawing/c";
NSString *date = @"Thu 25 Nov 2014";
NSString *wholeString = self.descLabel.text;
NSRange pathRange = [wholeString rangeOfString:path];
NSRange range=NSMakeRange(pathRange.location,path.length);

NSMutableParagraphStyle* style= [NSMutableParagraphStyle new];
style.lineBreakMode= NSLineBreakByTruncatingMiddle;


NSMutableAttributedString* str=[[NSMutableAttributedString alloc]initWithString: self.descLabel.text];
[str addAttribute: NSParagraphStyleAttributeName value: style range: range];
self.descLabel.attributedText= str;

这似乎没有做任何事情。有人建议我是否做错了什么

【问题讨论】:

  • 如果是 UILabel,为什么不直接在 UIlabel 上设置 linebreakmode 而是作为简单的文本,而不使用属性字符串?

标签: ios uilabel nsattributedstring


【解决方案1】:

使用非常简单的正则表达式的未优化示例。此示例要求路径以正斜杠开头,并且路径始终位于最后。

NSString *test = @"Thu 25 Nov 2014 /Shared/Documents/Drawing/c";
NSString *resultPath = @"";
// Create a range for it. We do the replacement on the whole
// range of the text, not only a portion of it. This can be optimized.
NSRange range = NSMakeRange(0, test.length);

NSError *errors = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(/.*)" options:NSRegularExpressionCaseInsensitive|NSRegularExpressionDotMatchesLineSeparators error:&errors];

NSArray *matches = [regex matchesInString:test options:NSMatchingProgress range:range];
if(matches.count == 1 && !errors) {
    NSTextCheckingResult* result = matches[0];
    // One result found
    resultPath = [test substringWithRange:result.range];
} else {
    // many results found or error
}

resultPath 现在将包含:“/Shared/Documents/Drawing/c”。

现在您可以简单地将结果添加到您的标签或将其添加到属性字符串以获得更多自定义功能,就像您已经完成的那样。

正如我一开始所说。这是一个非常基本的正则表达式示例..

【讨论】:

  • OP 似乎只想识别路径的范围,以便可以将属性应用于属性字符串的那部分。我认为问题的标题具有误导性。
  • 是的。 result.range 包含搜索范围。
  • 好的。 OP 的代码在查找范围方面看起来还不错,为了进一步误导我们,我想他们想知道为什么 NSLineBreakByTruncatingMiddle 属性没有效果。
  • @trojanfoe 你是对的。我再次阅读了这个问题,是的,它写得不是很好,但我会留下答案以供将来参考。
  • 为努力和态度以及体面的代码点赞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多