0

我正在尝试获取文本视图的第一句话。我有以下代码,但出现越界错误。谢谢你。或者有什么方法不是很复杂。

   -(IBAction)next:(id)sender
{
    NSRange ran = [[tv.text substringFromIndex:lastLocation] rangeOfString:@". "];
    if(ran.location != NSNotFound)
    {
        NSString * getRidOfFirstHalfString = [[tv.text substringFromIndex:lastLocation] substringToIndex:ran.location];
        NSLog(@"%@",getRidOfFirstHalfString);
        lastLocation+=getRidOfFirstHalfString.length;
    }
4

4 回答 4

4

我知道您已经接受了这个问题的答案,但您可能需要考虑使用文本视图tokenizer而不是仅搜索字符串". " 。标记器将自动处理标点符号,如!,?和右引号。你可以像这样使用它:

id<UITextInputTokenizer> tokenizer = textView.tokenizer;
UITextRange *range = [tokenizer rangeEnclosingPosition:textView.beginningOfDocument
    withGranularity:UITextGranularitySentence
    inDirection:UITextStorageDirectionForward];
NSString *firstSentence = [textView textInRange:range];

如果你想枚举所有的句子,你可以这样做:

id<UITextInputTokenizer> tokenizer = textView.tokenizer;
UITextPosition *start = textView.beginningOfDocument;
while (![start isEqual:textView.endOfDocument]) {
    UITextPosition *end = [tokenizer positionFromPosition:start toBoundary:UITextGranularitySentence inDirection:UITextStorageDirectionForward];
    NSString *sentence = [textView textInRange:[textView textRangeFromPosition:start toPosition:end]];
    NSLog(@"sentence=%@", sentence);
    start = end;
}
于 2012-07-25T03:01:16.233 回答
4

怎么样:

NSString *finalString = [[tv.text componentsSeparatedByString:@"."] objectAtIndex:0] // Get the 1st part (left part) of the separated string

浏览 textview 的文本并将文本分成单独的组件,您可以在其中通过调用找到句componentsSeperatedByStringtv.text。您想要一句话,这将是数组中的第 0 个对象。

于 2012-07-25T02:41:29.920 回答
1

尝试检查是否确实找到了子字符串。

NSRange ran = [tv.text rangeOfString:@". "];
if(ran.location != NSNotFound)
{
    NSString * selectedString = [tv.text substringToIndex:ran.location];
    NSLog(@"%@",selectedString);
}
于 2012-07-25T02:29:17.577 回答
0

您也可以尝试像这样使用 NSScanner:

NSString *firstSentence = [[NSString alloc] init];
NSScanner *scanner = [NSScanner scannerWithString:tv.text];
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"."];
[scanner scanUpToCharactersFromSet:set intoString:&firstSentence];

我不确定你是否想要这个,但既然你想要第一句话,你可以附加一个句号(你可能知道如何做到这一点,但无论如何显示它并没有什么坏处):

firstSentence = [firstSentence stringByAppendingFormat:@"."];

希望这可以帮助!

PS:如果它不适合你,也许文本视图实际上不包含任何文本。

于 2012-07-25T02:31:08.983 回答