我想这是一个有点尴尬的问题,所以让我用一个例子来改写它:
我有一个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>
如果有任何关于如何做到这一点的建议我会非常感激 - 如果有更简单的方法可以实现我想要做的事情。
答案 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)];