view.endEditing导致应用程序冻结某些textFields

时间:2016-04-10 08:45:56

标签: swift

问题解决了。见帖子结尾。

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

问题简要概述: 使用我的自定义键盘在textField中输入值。点击完成按钮(应触发view.endEditing)和一些textFields将导致应用程序冻结,大多数时间Xcode甚至不会抛出错误,而只是重新启动应用程序,但我确实抓了一次(图片如下)。它在某些textFields上按预期工作。

所以我有一个带有一堆textFields的视图控制器供用户填写,然后进行计算。

我制作了一个自定义键盘,它基本上是带有“完成”按钮的小数点。我通过制作keyboard.xib文件和keyboard.swift文件来做到这一点。

下面是错误的快照,我已经包含了一大堆我的代码,因为我正在使用一种不是最好的方法。

Error Snapshot

这就是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中我很确定我已经包含了访问键盘所需的所有内容,因为它适用于某些textFields。如:

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

然后这个功能(在我看来是这个问题):

    func keyDone() {
        view.endEditing(true)
        //activeTextField.resignFirstResponder()
    print("please dont freeze")
    }

我检查了所有连接,它们似乎没问题。

如果我可以添加更多信息以帮助解决问题,请告诉我。 非常感谢。

解决!!! 我想生病只是把它打倒在头上而不是从屏幕上休息一下!我仍然很困惑为什么没有给出更具体的错误。

问题在于,在某些情况下,其中一个函数除以零(这是未定义的......不可能)但是从中获取一个好处(谢谢Olivier)是帮助找到问题的工具代码正在失去理智。 This tutorial helped me understand how to use instruments!所以,一旦我看到它疯狂的地方,我就设置了一堆打印语句来观察值,因为它们进入了“问题”计算,在那里我发现分母为零。稍微重新排列代码以避免这种情况并解决问题!

1 个答案:

答案 0 :(得分:1)

此错误消息基本上是说存在内存问题,请尝试使用乐器运行代码(特别是分配)这可能会显示键盘出现问题

编辑2:对于今后发现此错误消息的任何人(在本例中为实际解决方案)

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