【问题标题】:How to properly solve the EXC_BAD_ACCESS (code=EXC_i386_GPFLT) error in my function如何正确解决我的函数中的 EXC_BAD_ACCESS (code=EXC_i386_GPFLT) 错误
【发布时间】:2017-04-17 12:09:24
【问题描述】:

好的,这里是 Swift 菜鸟。浏览一些初学者教程。

为了实现某个目标,

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

但是,此问题的公认答案允许在必要时进行更多微调。

【问题讨论】:

  • 你为什么不用number keyboard
  • @SB87 : JuicyFruit 是绝对正确的。你为什么不使用数字键盘..?它只允许输入数字。
  • @JuicyFruit & anilkukdeja:请参阅我最初问题的 PS。我怀疑我将来会需要更高级的选择,所以现在可以使用小键盘,但我还需要了解如何强制执行其他选择。

标签: swift error-handling uitextfield runtime-error


【解决方案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
}

【讨论】:

  • 是的,解决了! +1 获取额外信息。不过有一件事:只有当我将第一个选项中的 != nil 更改为 == nil 并将第二个选项中的 == nil 更改为 != nil 时,您的解决方案才有效,但仍然......thnx!
猜你喜欢
  • 2014-09-10
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多