我对文字字段有疑问。我写信是为了让用户只能在文本字段中输入数字。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
static NSCharacterSet *charSet = nil;
if(!charSet) {
charSet = [[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet] retain];
}
NSRange location = [string rangeOfCharacterFromSet:charSet];
return (location.location == NSNotFound);
}
上面是代码,它现在工作正常,唯一的问题是如何释放charSet,因为我已经保留了它。如果我在这里发布它会崩溃。请给我发短信的方式。或者,如果我保持这样的话,它仍然可以吗?
答案 0 :(得分:1)
你永远不应该保留charSet
。当它涉及到它时它会被自动释放:它的存在时间足以让其余的代码运行,然后单独存在。
当然,如果您使用iOS 5和ARC,您将永远不必担心保留和再次发布......
编辑:哦,我知道问题是什么,你正在分配静态。那么,就像你正在做的那样保留它,然后让它泄漏。无论是使用实例变量还是使用实例变量,您都可以对其进行内存管理。抱歉第一次得错答案,但最好承认我不小心读了...... :)
另一个编辑:但为什么你分配给静态?你真的认为这会节省你很多时间吗?这不是“过早优化”的情况吗?计算机真的很快,比用户输入的速度快得多;我认为您的设备每次通过此例程都可以非常愉快地计算[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]
,而不会减慢速度。
答案 1 :(得分:0)
如果您只想验证用户是否输入了数字,那么您可以
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"0123456789"]] length]) {
return NO;
}
return YES;
}
或只是将键盘设为数字键盘。
您的方法仅检查输入是否有数字,而不是仅包含数字。除非您已禁用复制/粘贴功能,否则您需要检查所有输入是否有效。