0

如何防止用户使用它:

在此处输入图像描述

4

1 回答 1

1

解决方案是使用 UISearchBar 委托方法:

  • (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)范围替换Text:(NSString *)text

当用户输入文本时,新字符出现在“文本”变量中。如果有选择,则范围有长度,否则为 0。删除是选择但长度为 0 的文本。

为了防止某些字符被处理,您将从此委托方法返回 NO。如果你想变得花哨,你可以抓取当前文本(searchBar.text),将其更改为“不要使用 EMOJII!”,然后使用 dispatch_after() 将文本在 1 秒左右后重置为旧值。

显然,您需要弄清楚 Emojii 的 unicode 范围和/或您想要阻止的任何其他内容。

编辑:所以我对 Emojii 进行了更多研究,这就是委托方法中发生的情况:

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    for(int i=0; i<[text length]; ++i) {
        NSLog(@"UNICHAR = %x", [text characterAtIndex:i]);
    }
    unichar c = [text length] == 1 ? [text characterAtIndex:0] : (unichar)'?';
    NSLog(@"Text: %@ unichar=%C (hex=%x)", text, c, c);

    return YES;
}

点击 Emojii 字符可以得到这个输出:

2012-08-05 10:09:21.121 Searcher[563:707] UNICHAR = d83d
2012-08-05 10:09:21.130 Searcher[563:707] UNICHAR = de28
2012-08-05 10:09:21.135 Searcher[563:707] Text:  unichar=? (hex=3f)
2012-08-05 10:09:22.031 Searcher[563:707] UNICHAR = d83d
2012-08-05 10:09:22.035 Searcher[563:707] UNICHAR = de28
2012-08-05 10:09:22.040 Searcher[563:707] Text:  unichar=? (hex=3f)
2012-08-05 10:09:22.703 Searcher[563:707] UNICHAR = d83d
2012-08-05 10:09:22.709 Searcher[563:707] UNICHAR = de28
2012-08-05 10:09:22.715 Searcher[563:707] Text:  unichar=? (hex=3f)
2012-08-05 10:09:31.964 Searcher[563:707] UNICHAR = d83d
2012-08-05 10:09:31.969 Searcher[563:707] UNICHAR = de22
2012-08-05 10:09:31.973 Searcher[563:707] Text:  unichar=? (hex=3f)

所以很明显,当你使用 Emojii 键盘时,你会得到长度为 2 的文本,上面的十六进制值。Emojii 占据了 Unicode 的范围,如果你用 google 搜索,你会发现很多。

于 2012-08-04T13:47:23.413 回答