在NSString中查找字符(#)的最后一个索引(位置)

5

想要获取 # 的最后一次出现的索引,但是下面的代码对于其他字符可以正常工作,但是对于特别的 "#" 却不能给出完美的结果。

在 viewDidLoad 中代码能够正常工作,但是在 textfield shouldChangeCharactersInRange 中却不能正常工作。

代码:

txtTest.text = @"@ashish @test #vijay $4030 @post";


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
   NSRange range = [textField.text rangeOfString:@"a" options:NSBackwardsSearch];        
    NSLog(@"a :: %d   ",range.location);

    range = [str rangeOfString:@"@" options:NSBackwardsSearch];
    NSLog(@"@ :: %d   ",range.location);

    range = [str rangeOfString:@"#" options:NSBackwardsSearch];
    NSLog(@"# :: %d",range.location);

    range = [str rangeOfString:@"$" options:NSBackwardsSearch];
    NSLog(@"$ :: %d\n",range.location);

}

结果 :: a :: 17 @ :: 26 # :: 2147483647 $ :: 20

请输入图像描述


2
那是 NSNotFound。也许这些字符看起来相同,但实际上并不相同,或者其中有一个零宽度空格之类的东西? - Gerd K
是的,在你的@"#"字符串中有一个不可见的字符。使用箭头键在其上移动光标,您将看到它。 - Gerd K
复制并粘贴到Xcode(这可能会自动格式化一些内容,甚至编码问题)。修正了第一行的NSString拼写错误,运行正常。 - lupz
a :: 17
@ :: 26

:: 13

$ :: 20,我发现这个结果是纠正NSString拼写后得出的
- Jamil
@jamil 当我把相同的代码放在viewDidLoad中时,它可以正常工作,但是在shouldChangeCharactersInRange中却无法工作。请用string替换"str"。 - Ashish Thummar
2个回答

8

尝试使用%lu无符号长整型代替%d。这样做可以正常工作。

NSString *str = @"ashish @test #vijay $4030 @post";

NSRange range = [str rangeOfString:@"a" options:NSBackwardsSearch];
NSLog(@"a :: %lu   ",(unsigned long)range.location);

range = [str rangeOfString:@"@" options:NSBackwardsSearch];
NSLog(@"@ :: %lu   ",(unsigned long)range.location);

range = [str rangeOfString:@"#" options:NSBackwardsSearch];
NSLog(@"# :: %lu",(unsigned long)range.location);

range = [str rangeOfString:@"$" options:NSBackwardsSearch];
NSLog(@"$ :: %lu\n",(unsigned long)range.location);

a :: 17

@ :: 26

# :: 13

$ :: 20


感谢回复,在viewDidLoad中它可以正常工作,但在shouldChangeCharactersInRange中它不起作用。 - Ashish Thummar
在 shouldChangeCharactersInRange 中也正常工作。 - MOHAMMAD ISHAQ
奇怪,但在我的机器上不起作用 :( 我也附上了截图。 - Ashish Thummar
1
如果字符不在文本字段中,它会将一个随机的大整数显示为文本“ash”,日志显示为:: 0 @ :: 9223372036854775807 # :: 9223372036854775807 $ :: 9223372036854775807。因此,请仔细检查您的委托和字段。 - MOHAMMAD ISHAQ
请尝试更改您的范围对象名称,因为相同名称的NSRange对象来自shouldChangeCharactersInRange方法。 - MOHAMMAD ISHAQ
是的,当字符不存在时,它会显示随机大数字,但如果是字符串常量字符,则除“#”外都有效,还尝试了NSRange对象,但结果相同。 - Ashish Thummar

3

首先,您有一个拼写错误。应该是 NSString *str,而不是 NSSting *str

其他部分在我的机器上运行良好。

NSString *str = @"ashish @test #vijay $4030 @post";

NSRange range = [str rangeOfString:@"a" options:NSBackwardsSearch];
NSLog(@"a :: %lu   ",range.location);

range = [str rangeOfString:@"@" options:NSBackwardsSearch];
NSLog(@"@ :: %lu   ",range.location);

range = [str rangeOfString:@"#" options:NSBackwardsSearch];
NSLog(@"# :: %lu",range.location);

range = [str rangeOfString:@"$" options:NSBackwardsSearch];
NSLog(@"$ :: %lu\n",range.location);

答案:

2016-02-29 15:19:39.554 StackOverflowDemo[9189:1825956] a :: 17   
2016-02-29 15:19:39.555 StackOverflowDemo[9189:1825956] @ :: 26   
2016-02-29 15:19:39.555 StackOverflowDemo[9189:1825956] # :: 13
2016-02-29 15:19:39.555 StackOverflowDemo[9189:1825956] $ :: 20

你能再清楚地表达一下吗?


在viewDidLoad中工作正常,但在shouldChangeCharactersInRange中不起作用 :( - Ashish Thummar
你有检查(并重新输入)评论中提到的字符串吗?你的字符串中确实有一些“非标准”字符,而且不同的位置也清楚地表明了这一点。 - Eiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接