如何避免在两个UITextView上分割单词

时间:2011-05-20 08:18:36

标签: iphone objective-c cocoa-touch uitextview

我想这是一个有点尴尬的问题,所以让我用一个例子来改写它: enter image description here

我有一个UITextView,仅限于一定数量的字符。定期使用- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString *)aText进行检查。一旦文本大于thresh hold(在插图中它将是8个字符),app将更改为下一个textView并将输入的下一个char(在本例中为p)复制到新的UITextView。然后,用户可以输入单词的其余部分(在本例中为py)。

我希望在下一个UITextView中拥有整个单词“happy”,而不是将单词分成两个UITextViews。换句话说,我需要将'hap'从字符串1复制到字符串2的开头,然后从字符串1中删除'hap'。

我想出了这个代码,它检查字符串1的空格,并将空格后的所有内容复制到字符串2中。但它不起作用:

NSLog(@"text of current string: %@", aTextView.text);           // e.g. "I am hap"
         NSLog(@"chars in aTextView.text: %i", aTextView.text.length);  // e.g. 8 chars
         NSLog(@"text for next string: %@ ", aText);                    // e.g. "py"

         NSString *aTextModified = aText;

         for (int i = aTextView.text.length; i > 0; i--) {

             NSLog(@"I currently check: '@%'", [aTextView.text characterAtIndex:i]);

             if ([[aTextView.text characterAtIndex:i] isEqualToString:@" "]) {
                 // job done
             } else {
                 NSLog(@"I add %@ infront of %@", [aTextView.text characterAtIndex:i], aText);
                 aTextModified = [NSString stringWithFormat:@"%@%@", [aTextView.text characterAtIndex:i], aText];
                 NSLog(@"I delete %@ as I have put it into the next string...", [aTextView.text characterAtIndex:i]);
                 [aTextView.text characterAtIndex:i] = @"";
             }
         }

XCode为行if ([[aTextView.text characterAtIndex:i] isEqualToString:@" "])提供了警告'无效接收器类型'unichar''。我想我没有使用characterAtIndex吗?我不允许将它应用于UITextView中的文本(应该是UIString)吗?

另外,我在最后一行[aTextView.text characterAtIndex:i] = @"";收到错误'LValue required as as opigrand of assignement'。再次,我想我真的不明白如何访问UITextView中的char并修改它。 / p>

如果有任何关于如何做到这一点的建议我会非常感激 - 如果有更简单的方法可以实现我想要做的事情。

2 个答案:

答案 0 :(得分:1)

好的,让我们开始简单吧。我创建了以下正则表达式,它将匹配字符串中的最后一个单词,如果有非单词字符,如空格或标点符号。

我认为使用正则表达式更容易,并确定它匹配的位置来操作字符串。但是我不确定大文本中的性能如何,但我认为这可以通过使用一些假设来解决:textview one不会在前1000个字符内跳过,所以最好只使用最后50个字符来安全正则表达式。

NSString *aString = @"I am happy however I want the last word and it's positions !!!!";

NSString * const regularExpression = @"\\b(\\w+)\\b(\\W*)$";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regularExpression
                                                                       options:NSRegularExpressionCaseInsensitive | NSRegularExpressionUseUnicodeWordBoundaries
                                                                         error:&error];

NSArray *matches = [regex matchesInString:aString
                                  options:0
                                    range:NSMakeRange(0, [aString length])];

for (NSTextCheckingResult *match in matches) {
    for (int i = 0; i < [match numberOfRanges]; i++) {
        NSLog(@"substring %d: %@", i, [aString substringWithRange:[match rangeAtIndex:i]]);
    }
}

如果它匹配,您可以轻松地遍历结果,该结果为您提供最后一个单词和一些尾随非单词字符,但最重要的是您获得每个匹配的范围,以便您可以确定是否超过阈值。

答案 1 :(得分:1)

很少有事情

NSLog(@"I currently check: '@%'", [aTextView.text characterAtIndex:i]);

您在此处获得了C个字符,因此您应该使用%c代替。

[[aTextView.text characterAtIndex:i] isEqualToString:@" "]

同样,你在这里做的是向C字符发送一条不正确的消息。您可以将其更改为[aTextView.text characterAtIndex:i] == " "以正确执行此操作。

[aTextView.text characterAtIndex:i] = @"";

text被定义为不可变的字符串。你不能这样改变它。您必须声明一个可变字符串并将text的内容复制过来。修改可变字符串后,您可以将其设置为text

这也会给你最后一句话。

NSScanner *wordsScanner = [NSScanner scannerWithString:@"I am happy however I want the last word and it's positions !!!!"];
NSString *theLastWord;
while (![wordsScanner isAtEnd]) {
    [wordsScanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] intoString:&theLastWord];
}

// theLastWord has the value.

修改

NSString *text = aTextView.text;
int index = text.length - 1;
while ([text characterAtIndex:index] != " ") {
    index--;
}

NSString stringToBeMoved = [text substringFromIndex:index];
aTextView.text = [text substringToIndex:(index+1)];