Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 阻止用户输入文本_Ios_Swift_Nscharacterset - Fatal编程技术网

Ios 阻止用户输入文本

Ios 阻止用户输入文本,ios,swift,nscharacterset,Ios,Swift,Nscharacterset,我在看这本书 IOS编程:大书呆子牧场指南 我正在创建一个将华氏温度转换为摄氏温度的简单应用程序,最后一个挑战是防止用户键入字母字符,这是我的尝试 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

我在看这本书

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
        }

    }

它可以工作,但我得到一个警告说“返回后的代码将永远不会执行”,有更好的方法来防止这个警告吗?提前谢谢你

错误消息是:

返回后的代码将永远不会执行

这基本上意味着无论何时添加
return
语句,都不会执行该语句后面的代码

警告来自此行:

return allowedCharacters.isSuperset(of: characterSet)
我认为您不需要下面的代码,因为在该函数中,我打赌您只想返回允许的字符,否则返回false。

警告

'返回后的代码将永远不会执行

编译器已经对您的代码进行了分析,并告诉您下面的任何内容
都返回allowedCharacters.isSuperset(of:characterSet)
将永远不会执行

正如您所说:它可以工作,但我收到一条警告,上面说“返回后的代码将永远不会执行”。有更好的方法来防止此警告吗?

Ans:要删除此警告,只需删除此语句下方的整个代码
返回allowedCharacters。IssupSet(of:characterSet)
,警告将被删除

如果您正在寻找更好的方法,我会推荐下面的方法,有比这更好的方法,但我不知道

顺便说一句

实现功能,即防止用户输入文本。您只需更改键盘类型

textField.keyboardType = .decimalPad // this only works in iPhone not in iPad
由于更改键盘类型仅在
iPhone
中有效,而在
iPad
中无效,因此最好实现
textfield
中允许的字符,在
textfield
中,委托方法
应更改
中的字符,如下所示:

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

}

是:不要将代码放在
return
语句之后。你有没有试过输入1.5,看看它是否真的有效?这对你通过书本学习iOS很好。为了获得更好的知识,如果你更喜欢Apple doc的bcz,那就更好了。最重要的是,你第一次在Apple doc上看到的新东西改变了IOS,而不是其他任何网站和书籍。我支持Rashwan的回答。另外值得注意的是,您可以将文本字段的键盘类型更改为仅显示数字键盘或十进制键盘。:)@如果发生以下情况,KimArnett更改键盘类型将不起作用iPad@Maddy是的,感谢您的澄清。此答案中的代码仍然存在问题,因为它仍然允许用户输入字符串,如
1.2.3.4.5
。是@rmaddy这就是问题所在,每个人都说我应该删除return语句下面的部分,但这部分也很有用。我的问题是如何保留这两个警告并删除它们。