【问题标题】:Capture first line of NSString捕获 NSString 的第一行
【发布时间】:2011-04-17 23:20:24
【问题描述】:

如何从 NSString 对象中捕获第一行?

我目前正在将整个 NSString 对象分配给我的 textView 的标题,但只想分配字符串的第一行。我目前的代码是这样的:

self.textView.text = [[managedObject valueForKey:@"taskText"] description];

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    你想要

    self.textView.text = [[[[managedObject valueForKey: @"taskText"] description] componentsSeparatedByString: @"\n"] objectAtIndex:0];
    

    http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

    【讨论】:

    • 由于-componentsSeparatedByString: 返回一个NSArray 实例,您不能使用C 数组[] 语法。您需要改为发送-objectAtIndex:。
    • 另外,由于换行符有多种表示形式,您应该使用-componentsSeparatedByCharactersInSet: 和+[NSCharacterSet newlineCharacterSet]。
    • 如果有 10,000 行,而您只想剥离第一行而不解析其他 9,999 行怎么办?
    【解决方案2】:

    如果您的目标是 iOS 4.0 及更高版本,您可以使用-[NSString enumerateLinesUsingBlock:]:

    __block NSString *firstLine = nil;
    NSString *wholeText = [[managedObject valueForKey:@"taskText"] description];
    [wholeText enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
        firstLine = [[line retain] autorelease];
        *stop = YES;
    }];
    
    self.textView.text = firstLine;
    

    【讨论】:

    • 有什么可以解释为什么在分配给 firstLine 时需要小保留/自动释放的舞蹈吗?我认为这是由于块池(?)被刷新,但尚未阅读任何实际描述这一点的内容。谢谢!
    【解决方案3】:

    一种可能是最有效和最直接的替代方法:

    NSString* str = [[managedObject valueForKey:@"taskText"] description]; self.textView.text = [str substringWithRange:[str lineRangeForRange:NSMakeRange(0, 0)]];

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多