好的,这里总共有Swift noob。通过一些初学者教程。
为了达到某个目标,
我需要一个UITextField才能接受数字
我设法通过此代码让UITextField只接受字母:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var TextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.TextField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let allowedCharacters = CharacterSet.letters
let characterSet = CharacterSet(charactersIn: string)
return allowedCharacters.isSuperset(of: characterSet)
}
}
但是,只要我将allowedCharacters
转换为:
let allowedCharacters = CharacterSet(charactersIn: "0123456789")
Simulator
仍然成功启动(我收到Build Succeeded
条消息)
但是,一旦我开始输入它就崩溃了。 Xcode然后突出显示我的return
语句并显示错误消息:
Thread 1: EXC_BAD_ACCESS (code=EXC_i386_GPFLT)
当我谷歌的时候,我觉得它可能与我在函数中的某个地方需要一个if-statement
以捕捉任何意外的值这一事实有关,我猜这些值很快就会被返回当我开始在文本字段中输入时,但我无法看到关于在何处和如何进行的逻辑。
任何启发我的想法都会很棒!
PS :我知道我也可以将我的文本字段配置为仅显示一个小键盘,但我仍然想知道为什么当前的解决方案导致问题我可能需要其他更高级的,将来某个时候的限制。
修改
另一个有效的解决方案(我在发布问题后发现)是改变我对allowedCharacters的声明:
let allowedCharacters = CharacterSet.decimalDigits
然而,这个问题的公认答案允许在必要时进行更多的微调。
答案 0 :(得分:1)
如果你想以这种方式处理它,而不是从字符串中创建一个字符集并检查它是否是一个子集,你应该使用字符串的方法rangeOfCharacter(from: CharacterSet) -> Range<String.Index>?
。如果当前集合中没有字符,则此方法返回给定集合中字符的位置或nil。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print(string)
let allowedCharacters = CharacterSet(charactersIn: "0123456789")
return string.rangeOfCharacter(from: allowedCharacters) != nil
}
但是,在此处指定允许的字符不是一个好方法,您将阻止用户使用退格键删除字符。您应该指定不允许的字符,然后此函数将更改为:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print(string)
let disallowedCharacters = CharacterSet(charactersIn: "0123456789")
return string.rangeOfCharacter(from: disallowedCharacters) == nil
}