【问题标题】:What is causing NSNull length unrecognized selector keyCommand error是什么导致 NSNull 长度无法识别的选择器 keyCommand 错误
【发布时间】:2014-12-25 07:52:22
【问题描述】:

我在一个项目中有这个类/故事板场景,在我过去 4 周的工作中直到昨晚都运行良好。

我已经设法注释掉几乎所有内容,但在点击 UITextField 并输入数字时仍然会崩溃。只有当我输入一个值时它才会崩溃,否则它不会崩溃。

这是我现在正在运行的课程:

import Foundation
import UIKit
import HealthKit
import CoreData

class WorkoutViewController: UITableViewController {

//Properties
    @IBOutlet var numberOfLapsTextField: UITextField?
    @IBOutlet var metersPerLapTextField: UITextField?
    @IBOutlet var workoutDurationTextField: UITextField?
    @IBOutlet var paceTextField: UITextField?

    var  healthStore:HKHealthStore?

override func viewDidLoad() {
        super.viewDidLoad()
}

最初它的 IBOutlets 为 !代替 ?它有一个 CoreData 堆栈属性,tableview 背景的一些模糊背景效果,从 viewDidLoad 上的健康存储中获取用户的体重,一个用于健康存储获取的谓词辅助方法以及一个取消和完成按钮。完成按钮从文本字段中捕获数据,进行一些计算并将数据保存到健康存储和核心数据。但是所有这些都已被注释掉,只留下上面看到的内容。

有一次我确实设法在控制台中获得了一个奇怪的堆栈跟踪(似乎再也找不到了),上面写着:

[UIPhysicalKeyboardEvent _matchesKeyCommand:]

还有一些其他人喜欢它。

我很难过,有什么想法吗?异常断点是其中之一,但它只是将我带到了采用 UIResponder 的 AppDelegate 类声明行。我学习并重建。我不知道还要找什么。

我认为它是一个损坏的故事板文件,因为我添加和删除了带有文本字段的场景并且它们的行为都相同。这是我的 storyboard.xml 文件:

http://www.santiapps.com/iOS/Main.storyboard.xml

【问题讨论】:

  • 这可能是一个僵尸对象。请参阅stackoverflow.com/questions/5386160/… 确认这一点,然后使用 Instruments 找出创建僵尸的原因。
  • 我运行了 Zombies & Profiler,但什么也没得到。它仍然崩溃,但分配列表中没有僵尸。 NSZombie 检测已启用。
  • 好吧,您的数据中有一个 NSNull。您需要学习如何获取正确的异常堆栈跟踪,以便确定异常被抛出的位置,然后查看该点的数据。如果您使用的是 JSON,则数据中可能有一个 null 元素。
  • null 是由长度调用抛出的,我没有直接在我的代码中进行调用。我分析了堆栈跟踪,正如我在原始问题中发布的那样,它是从 UIPhysicalKeyboardEvent _matchesKeyCommand 抛出的:我不明白为什么我的问题被否决了
  • 了解如何获取正确的堆栈跟踪,然后在此处发布。

标签: ios8 nsnull


【解决方案1】:

点击视图控制器和属性检查器下的关键命令删除“在下面输入操作”条目

【讨论】:

    【解决方案2】:

    我因同样神秘的NSNull length 消息而崩溃。在模拟器中进行测试时,它偶尔会出现在一个屏幕上,经过反复试验,我发现它仅在我按下 cmd 键时才会发生。

    查看我的故事板源,我发现了以下内容:

                    <keyCommands>
                        <keyCommand/>
                    </keyCommands>
    

    我认为这可以让您为使用蓝牙键盘的任何人定义键盘快捷键。但是 - 这是一个空定义,所以似乎按下 cmd 会导致执行失败,因为我没有定义任何有效的快捷方式。

    我完全不知道这是怎么发生的,但是如果您使用图形界面生成器 UI 查看您的 Storyboard,请转到给出问题的视图控制器并单击根视图控制器。在属性检查器下有一个键盘命令部分。我想我一定是在某些时候不小心点击了这里的 + 按钮。您可以选择第一个“项目”并点击 - 以摆脱它,问题应该会消失。

    或者,直接从 Storyboard 源中删除 keyCommands 部分。

    我看到此问题已被标记为已回答,但我将其包含在内,以防原始答案(和评论)之上的附加信息对其他人有用。

    【讨论】:

    • 谢谢你,你真的救了我的命
    • 谢谢!我有同样的问题。删除 keyCommands 部分就可以了。
    • 这对我也有用,方法是在源代码中搜索 keyCommands 并将其删除。比更换更快的解决方案!
    【解决方案3】:

    好的,我删除了导航控制器和标签栏控制器并重新添加了它们,问题就消失了!输入数据时不再出现崩溃。这显然是一个损坏的场景,但奇怪的是,突然之间,所有带有 uitextfields 的场景都以同样的方式损坏了。

    我想补充一点,高级 SO 用户真的应该在用户投反对票之前花时间与发布问题的用户交谈。或者应该允许用户对问题进行投票,因为有些人草率地得出结论并开始对实际上是有效问题的问题投票是不公平的。

    【讨论】:

    • 我同意这是一个有效的问题,你的答案对我来说是正确的,我重新创建了导航控制器,现在 uitextfields 正在工作。对我来说,即使添加一个新的 UITextField 也会使应用程序崩溃。
    • 应用修复后这是我在导航控制器场景中看到的已移除节点,我的猜测是空的actionName 是导致崩溃&lt;keyCommands&gt;&lt;keyCommand actionName=""/&gt;&lt;/keyCommands&gt; 的原因,只是一个猜测。跨度>
    • 这只是为我省去了很多痛苦和痛苦。做了同样的事情,问题解决了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2013-05-12
    • 2018-02-26
    • 2021-12-29
    • 2023-03-11
    • 2014-11-23
    相关资源
    最近更新 更多