Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Swift 如何正确解决my function中的EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)错误_Swift_Error Handling_Uitextfield_Runtime Error - Fatal编程技术网

Swift 如何正确解决my function中的EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)错误

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.

好的,那么这里就没有了。正在学习一些初学者教程

为了达到某个目的,

我需要一个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)

    }


}
但是,只要我将
允许的字符
转换为如下内容:

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!