在上面我评论的例子中,这很糟糕:
// Don't use:
- (BOOL)isPartialStringValid:(NSString *)partialString
newEditingString:(NSString **)newString
errorDescription:(NSString **)error
{
if ((int)[partialString length] > maxLength)
{
*newString = nil;
return NO;
}
}
改用这个(或类似的东西):
// Good to use:
- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
originalString:(NSString *)origString
originalSelectedRange:(NSRange)origSelRange
errorDescription:(NSString **)error
{
int size = [*partialStringPtr length];
if ( size > maxLength )
{
return NO;
}
return YES;
}
两者都是 NSFormatter 方法。第一个有问题。假设您将文本输入限制为 10 个字符。如果您将字符一个接一个地输入到 NSTextField 中,它会正常工作并防止用户超过 10 个字符。
但是,如果用户要将一个 25 个字符的字符串粘贴到文本字段中,将会发生如下情况:
1) 用户将粘贴到 TextField
2) TextField 将接受字符串
3) TextField 会将格式化程序应用于 25 长度字符串中的“最后一个”字符
4) Formatter 对 25 长字符串中的“最后一个”字符进行处理,忽略其余部分
5) TextField 最终会包含 25 个字符,即使它限制为 10 个。
这是因为,我相信,第一种方法只适用于输入到 NSTextField 中的“最后一个字符”。上面显示的第二种方法适用于输入到 NSTextField 中的“所有字符”。所以它不受“粘贴”漏洞的影响。
我刚刚发现这个试图破坏我的应用程序,并且不是 NSFormatter 专家,所以如果我错了,请纠正我。非常感谢你carlosb发布这个例子。它帮助了很多!:)