我正在关注这本书
IOS编程:大书呆子牧场指南
我正处于创建一个将华氏温度转换为摄氏温度的简单应用程序的部分,最后的挑战是阻止用户输入字母字符,这是我的尝试。
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
let allowedCharacters = CharacterSet.decimalDigits
let characterSet = CharacterSet(charactersIn: string)
return allowedCharacters.isSuperset(of: characterSet)
let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
let replacementTextHasDecimalSeparator = string.range(of: ".")
if existingTextHasDecimalSeparator != nil,
replacementTextHasDecimalSeparator != nil{
return false
}else{
return true
}
}
它有效,但我收到一条警告,上面写着“返回后的代码永远不会执行”是否有更好的方法来防止此警告?提前谢谢!
答案 0 :(得分:1)
警告,
'返回后的代码永远不会被执行
本身就是自解释的,编译器已对您的代码进行了分析,并告诉您return allowedCharacters.isSuperset(of: characterSet)
以下的任何内容都不会被执行。
正如你所说:它有效,但我收到一条警告,上面写着'返回后的代码永远不会被执行'是否有更好的方法来阻止此警告?
答案:要删除此警告,只需删除此语句return allowedCharacters.isSuperset(of: characterSet)
下方的整个代码,系统就会删除警告。
如果您正在寻找更好的方法,我会推荐以下方法,会有更好的方法,但这不是我所知道的。
BTW,
实现功能,即阻止用户输入文字。您只需更改键盘类型
即可textField.keyboardType = .decimalPad // this only works in iPhone not in iPad
由于更改键盘类型仅适用于iPhone
但不适用于iPad
,因此最好在textfield
委托方法textfield
中实施shouldChangeCharactersIn
中允许的字符如下所示,
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let inverseSet = NSCharacterSet(charactersIn:".0123456789").inverted // characters you want to allow in textfield
let components = string.components(separatedBy: inverseSet)
let filtered = components.joined(separator: "")
return string == filtered
}
答案 1 :(得分:0)
错误消息是:
返回后的代码永远不会被执行
这基本上意味着无论何时添加return
语句,都不会执行该语句之后的代码。
警告来自这一行:
return allowedCharacters.isSuperset(of: characterSet)
我认为您不需要下面的代码,因为在该函数中我打赌您只想返回允许的字符,否则返回false。