Swift view.endEditing导致应用程序在某些文本字段上冻结

Swift view.endEditing导致应用程序在某些文本字段上冻结,swift,Swift,问题已解决。请参阅文章末尾。 抱歉,如果这是一个有点长,但我希望我已经包括了尽可能多的信息来解决这个问题 问题概述:使用我的自定义键盘在文本字段中输入值。点击“完成”按钮(应该触发view.endEditing),一些文本字段将导致应用程序冻结,大多数时候Xcode甚至不会抛出错误,而是重新启动应用程序,但我确实捕捉到了一次(下图)。它在某些文本字段上按预期工作 因此,我有一个视图控制器,其中有一组文本字段供用户填写,然后执行计算 我做了一个自定义键盘,基本上是带有“完成”按钮的十进制键盘。为此

问题已解决。请参阅文章末尾。

抱歉,如果这是一个有点长,但我希望我已经包括了尽可能多的信息来解决这个问题

问题概述:使用我的自定义键盘在文本字段中输入值。点击“完成”按钮(应该触发view.endEditing),一些文本字段将导致应用程序冻结,大多数时候Xcode甚至不会抛出错误,而是重新启动应用程序,但我确实捕捉到了一次(下图)。它在某些文本字段上按预期工作

因此,我有一个视图控制器,其中有一组文本字段供用户填写,然后执行计算

我做了一个自定义键盘,基本上是带有“完成”按钮的十进制键盘。为此,我制作了一个keyboard.xib文件和一个keyboard.swift文件

这是一个错误的快照,我在下面包含了一大堆代码,以防我使用的方法不是最好的

以下是keyboard.swift文件的外观:

import UIKit

// The view controller will adopt this protocol (delegate)
// and thus must contain the keyWasTapped method
protocol KeyboardDelegate: class {
    func keyWasTapped(character: String)
    func keyDone()
    func backspace()
}

class keyboard: UIView {


    // This variable will be set as the view controller so that
    // the keyboard can send messages to the view controller.
    weak var delegate: KeyboardDelegate?

    // MARK:- keyboard initialization

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initializeSubviews()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initializeSubviews()
    }

    func initializeSubviews() {
        let xibFileName = "Keyboard" // xib extention not included
        let view = NSBundle.mainBundle().loadNibNamed(xibFileName, owner: self, options: nil)[0] as! UIView
        self.addSubview(view)
        view.frame = self.bounds
    }

    // MARK:- Button actions from .xib file

    @IBAction func keyTapped(sender: UIButton) {
        // When a button is tapped, send that information to the
        // delegate (ie, the view controller)
        self.delegate?.keyWasTapped(sender.titleLabel!.text!) // could alternatively send a tag value
    }

    @IBAction func backspace(sender: UIButton) {
        self.delegate?.backspace()
    }

    @IBAction func Done(sender: UIButton) {
        self.delegate?.keyDone()
    }


}
在viewController中,我非常确定我已经包含了访问键盘所需的所有内容,因为它适用于某些文本字段。例如:

class myViewController: UITableViewController,UITextFieldDelegate, KeyboardDelegate
然后在viewDidLoad中设置每个textField代理:

            self.textField1.delegate = self
            self.textField2.delegate = self
            self.textField3.delegate = self

  // initialize custom keyboard
        let keyboardView = keyboard(frame: CGRect(x: 0, y: 0, width: 0, height: numpad.height))
        keyboardView.delegate = self // the view controller will be notified by the keyboard whenever a key is tapped

        // replace system keyboard with custom keyboard
        textField1.inputView = keyboardView
        textField2.inputView = keyboardView
        textField3.inputView = keyboardView
然后这个函数(在我看来这是个问题):

我已经检查了所有的连接,看起来都很好

让我知道,如果我可以添加任何更多的信息,以帮助解决它。 非常感谢

解决了 我想我应该把它归结为在屏幕上敲打我的头,而不是在屏幕上休息一下!我仍然很困惑为什么没有给出一个更具体的错误


问题是,在某些情况下,其中一个函数被零除(这是未定义的…不可能),但从中可以得到一个好东西(谢谢Olivier),就是工具工具,可以帮助找到代码丢失的地方。因此,一旦我能看到它的疯狂之处,我就设置了一组打印语句,在数值进入“问题”计算时观察它们,我发现分母为零。重新排列代码以避免出现这种情况,问题就解决了

此错误消息基本上是说内存有问题,请尝试使用仪器运行代码(特别是分配),这可能表明键盘有问题

编辑2:适用于将来发现此错误消息的任何人(本例中的实际解决方案)


仔细检查keyDone()之后运行的任何代码,以查看是否存在会导致编译器假定需要无限内存的无限循环或情况。在这种情况下,一行代码被零除,导致了一个致命的内存错误(无法分配它生成的N/a值)

hmm,尝试一下,它没有解决,仍然只是冻结。我得仔细阅读一下仪器。谢谢你回来!好吧,不管怎么说,这是一个很长的机会,可能是内存泄漏。试着用仪器调试一下。是的,我现在正在读一读。当按下“完成”按钮时,它会执行计算功能,该功能会执行大约80行计算,这是否足以使内存过载?可能是,这取决于计算!当您运行仪器时,您应该能够缩小占用如此多内存的范围!这是一个很好的起点!也许可以检查一下你的计算中没有无限循环。也许某个特定的情况会导致一个循环永远持续下去,这肯定会成功!
    func keyDone() {
        view.endEditing(true)
        //activeTextField.resignFirstResponder()
    print("please dont freeze")
    }