Swift 如何正确解决my function中的EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)错误
好的,那么这里就没有了。正在学习一些初学者教程 为了达到某个目的, 我需要一个UITextField来只接受数字 我已通过以下代码使UITextField仅接受字母:Swift 如何正确解决my function中的EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)错误,swift,error-handling,uitextfield,runtime-error,Swift,Error Handling,Uitextfield,Runtime Error,好的,那么这里就没有了。正在学习一些初学者教程 为了达到某个目的, 我需要一个UITextField来只接受数字 我已通过以下代码使UITextField仅接受字母: import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet var TextField: UITextField! override func viewDidLoad() { super.
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)
}
}
但是,只要我将允许的字符
转换为如下内容:
let allowedCharacters=CharacterSet(charactersIn:“0123456789”)
Simulator
仍然成功启动(我收到一条buildsuccessed
消息)
然而,一旦我开始打字,它就会崩溃。Xcode然后突出显示我的return
语句并显示错误消息:
线程1:EXC\u坏访问(code=EXC\u i386\u GPFLT)
当我在谷歌上搜索它时,我感觉到这可能与我可能需要在函数中的某个地方使用if语句
来捕获任何我猜在我开始在文本字段中键入时会返回的意外值有关,但我还看不到在哪里以及如何返回的逻辑
任何能启发我的想法都会很棒
PS:我知道我也可以将我的文本字段配置为只显示一个numpad,但我仍然想知道为什么当前的解决方案会导致问题,因为我将来可能需要其他更高级的限制
编辑
另一个有效的解决方案(我在发布问题后发现)是更改我的allowedCharacters声明:
let allowedCharacters=CharacterSet.decimalDigits
但是,这个问题的公认答案允许在必要时进行更多微调 如果您希望以这种方式处理它,则不应使用字符串的方法
rangeOfCharacter(from:CharacterSet)->Range?
,而应使用字符串的方法rangeOfCharacter(from:CharacterSet)->Range?
。此方法返回给定集合中字符的位置,如果集合中没有字符,则返回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
}
为什么不使用数字键盘?@SB87:JuicyFruit绝对正确。你为什么不用数字键盘。。?它只允许输入一个数字。@JuicyFruit&anilkukdeja:请看我原来问题的PS。我想我将来会需要更多的高级选择,所以一个numpad可能现在就可以了,但我也需要了解如何执行其他选择。是的,这就解决了问题+1获取额外信息。但有一件事:只有在我更改
!=第一个选项中的nil
为==nil
,第二个选项中的==nil
为!=无,但仍然。。thnx!