Swift 2 Tapgesture 中无法识别的选择器

2024-02-18

我最近开始将我的应用程序更新到 Swift 2.0,但我遇到了一个问题,该问题在 SO 上有一百个不同的答案,但似乎都与我的问题无关。

(这在将应用程序更新到 Swift 2.0 之前有效),但我无法找到对点击手势识别器所做的任何更改?

这是我收到的完整错误:

[Stocks.Sid​​ePanelViewController proFormulaTapGesture]:无法识别的选择器发送到实例 0x14f06ae00

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Stocks.Sid​​ePanelViewController proFormulaTapGesture]:无法识别的选择器发送到实例 0x14f06ae00”

*** 首先抛出调用堆栈: (0x1830904d0 0x197afff9c 0x1830971ec 0x183094188 0x182f9920c 0x188c3c58c 0x188899b50 0x18872d104 0x188c3bc30 0x1886ed28c 0x1886 eb3ac 0x18872b088 0x18872a5ec 0x1886fb908 0x1886f9fac 0x183047d6c 0x183047800 0x183045500 0x182f75280 0x18e0ec0cc 0x188762df8 0x10 0158184 0x1983428b8) libc++abi.dylib:以 NSException 类型的未捕获异常终止

这是一个简单的点击手势。但它似乎不再识别选择器了。

这是我用来设置识别器的代码:

let proFormulaTap = UITapGestureRecognizer()

proFormulaTap.addTarget(self, action:"proFormulaTapGesture")
proFormulaView.addGestureRecognizer(proFormulaTap)

这是我尝试运行的函数:

func proFormulaTapGesture() throws {
        print("proFormulaTapGesture")
        selectView(proFormulaView)
        selectedMenuItem = 0
        Formula = 1
        menuTabBarController.selectedIndex = 0
        navigationController?.navigationBar.topItem!.title = "BASIC FORMULA"
        try (menuTabBarController.viewControllers as! [SuggestionsViewController])[0].loadSuggestions()
    }

但是,因为它永远不会在控制台中打印“proFormulaTapGesture”。我绝对认为错误发生在函数之前。提到选择器的错误也表明了这一点。

显然自 Swift 2.0 更新以来,try/catch 已添加到该函数中,但 tapGestureRecognizer 的设置没有任何更改。

我尝试删除“抛出”并从函数中尝试,但问题仍然存在。我还尝试制作一个按钮而不是点击手势识别器。但我仍然遇到同样的错误,这表明这可能是选择器(功能)的问题,而不是点击手势/按钮的问题。但是我的应用程序中的所有其他按钮都工作正常吗?

我还尝试重命名选择器/功能和点击手势识别器。还是一样。

原始代码是用 Swift 编写的,而不是 Obj-C。 throws 和 try 是在 Apple 代码转换为 Swift 2.0 期间添加的

任何有关为什么会突然中断的帮助将不胜感激。

Thanks!


问题可能是 UIKit 不知道如何调用选择器throws,至少在这种情况下。

请记住,UIKit 将调用此函数来响应点击操作。它不习惯调用这样的函数throws;显然throw就 Objective-C 运行时而言,必须更改方法的调用签名。除此之外,如果你的函数proFormulaTapGesture确实抛出了错误,即使 UIKit 可以捕获错误,它会如何处理该错误?

我不确定你在哪里添加的do/try/catch。但除非它在你的动作函数内proFormulaTapGesture,我不明白它有什么相关性。我相信您需要实施try/catch内部错误处理proFormulaTapGesture,这样它就可以有效地吞掉误差,这样proFormulaTapGesture不抛出。

我刚刚自己创建了一个快速测试项目,发现throwing 目标操作会给出与您相同的“无法识别的选择器”错误:

override func viewDidLoad() {
    super.viewDidLoad()

    self.tapper = NSClickGestureRecognizer(target: self, action: "didClick")
    self.view.addGestureRecognizer(self.tapper!)
}

func didClick() throws {
    print("did click")
}

2015-07-27 00:16:43.260 Test1 [71047:54227175] - [Test1.ViewController didClick]:无法识别的选择器发送到实例0x6000000c5010

...

我相信您需要重新编写代码以在操作函数内部处理错误,以便它不会抛出类似这样的错误:

func proFormulaTapGesture() {
    print("proFormulaTapGesture")
    selectView(proFormulaView)
    selectedMenuItem = 0
    Formula = 1
    menuTabBarController.selectedIndex = 0
    navigationController?.navigationBar.topItem!.title = "BASIC FORMULA"
    do {
        try (menuTabBarController.viewControllers as! [SuggestionsViewController])[0].loadSuggestions()
    } catch {
        // Handle the error here somehow
    }
}

如果您无法在以下时间内处理错误proFormulaTapGesture,您必须更有创意地将其传递出函数(想想 NSNotification 等...)。


需要明确的是,我在 Xcode 7 beta 4 中创建了一个新的 Single View iOS 应用程序,并使用这个确切的代码作为我的 ViewController。没有其他变化。该应用程序在 iOS 模拟器中编译并运行良好。

@robertvojta 还指出,如果didTap下面已标记private, @objc还需要避免动态调度崩溃。

import UIKit

class ViewController: UIViewController {

    var tapper: UITapGestureRecognizer?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tapper = UITapGestureRecognizer(target: self, action: "didTap")
        self.view.addGestureRecognizer(self.tapper!)
    }

    func didTap() {
        print("did Tap")
    }

}

(请注意,我还在 OS X 项目上进行了测试,这是我之前在答案中使用的代码)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 2 Tapgesture 中无法识别的选择器 的相关文章

随机推荐

  • 用逗号将一个字符串拆分为几列

    例如 我有下表 Block abcdefgh 12kjkjkj 231wewoxyz 我怎样才能将它转换成 Block1 Block2 Block3 abcdefgh 12kjkjkj 231wewoxyz Note 每个 块 最多有 8
  • 如何配置 jest 使用的 jsdom 实例?

    我遇到过这个问题在玩笑测试用例中需要 systemjs 时抛出无效 URL https github com systemjs systemjs issues 840 最后的评论之一建议 通过在 jsdom 中设置引荐来源网址配置来操纵 j
  • 更改 iPython 笔记本 Markdown 单元格中的字体

    我只是想将 Ipython 1 0 0 笔记本 Markdown 单元中的默认字体更改为其他内容 并尝试使用 Markdown 单元中的样式标签来执行此操作 而不是通过创建 custom css 的路径 我不懂 CSS 而且我的需求也很少
  • XML 架构参考

    我有两个 XML 模式 第一的 A xsd 位于库 jar 文件中 mylib jar 和第二个 B xsd 在我的项目中 我想进口A xsd进入B xsd并通过以下方式验证传入的 XMLJaxb2Marshaller嵌入式验证器 但是我无
  • Firebase populateViewHolder 永远不会被调用

    我的 firebase 控制台中有以下结构 我正在尝试读取值并显示所有用户 但 populateViewHolder 永远不会被调用 users OW5BYennVRXvfzOjfKpup9rZEYv2 email email protec
  • EF Core:在同一表中的项目之间创建链接

    假设我有一个公司列表 Company CompanyID CompanyA 1 CompanyB 2 CompanyC 3 CompanyD 4 假设我们想展示这一点CompanyA是的竞争对手CompanyB and CompanyC但不
  • 将HIVE查询结果中的空值或NULL值替换为特定值

    当查询未返回所选列之一的任何结果时 我尝试显示默认值 其他 我将向您展示这个例子 此查询返回空值os agent SO 第一行 select country os agent SO count from clicks data where
  • 单条语句同步?

    如果我有一个只有一个这样的语句的 getter 方法 public class NumberClass int number public int getNumber return number 并且多个线程访问此方法 我是否必须同步此方法
  • Java 中的可变字符串

    几乎每个人都知道 Java 中的字符串是不可变的 最近我发现一些事情可能表明这并不总是正确的 让我们尝试一下这段代码 System out println BEFORE MODIFICATIONS String beforeTest new
  • 如何跳过选择屏幕上的必填字段?

    我希望当我单击 Iptal 按钮时它跳过必填字段 但我不想在没有 强制 的情况下控制强制字段 我想在文本框中看到复选标记 例如屏幕截图 通常 当没有必填字段时 Iptal 按钮会调用不同的屏幕 注意 屏幕是标准选择屏幕 我解决这个问题的方法
  • EntityManager bean 的 @Autowired 与 @PersistenceContext

    有什么区别 Autowired private EntityManager em versus PersistenceContext private EntityManager em 这两个选项都适用于我的应用程序 但是我可以使用 Auto
  • 带有通配符领域的 Google 联合登录(混合 OpenID+OAuth)

    我正在尝试实施 Google 的OpenID OAuth https developers google com accounts docs OpenID oauth协议 当 openid realm 包含通配符时它不起作用 openid
  • 带有石英的自定义 UIBarButtonItem

    如何用石英绘制一个与 UIBarButtonItem 风格完全相同的按钮 按钮应该能够显示不同的颜色 我下载了Three20项目 但是这个项目非常复杂 你需要很多时间才能忽略整个框架 我只想绘制一个自定义 UIBarButtonItem 感
  • 为 azure blob 存储终结点配置自定义域名

    我正在关注有关如何为 Blob 存储端点配置自定义域的说明 https learn microsoft com en us azure storage blobs storage custom domain name register a
  • 电子邮件验证 MX 查找

    我被要求在网络应用程序上实现一些电子邮件地址验证 我相信我们都已经经历过一千次了 但是 这一次我被要求在域上进行 MX 查找 看看是否它接受电子邮件 有谁知道这样做有任何潜在的问题吗 mx 查找是确定域是否接受电子邮件的可靠方法吗 是否存在
  • 如何在我的本地仓库 Maven 中下载并安装 jar

    我正在尝试在 tomcat 下下载一个用于内部存储库的 jar 然后将其安装到我的本地 Maven 存储库 jar 文件可以在下面找到path http 10 11 250 14 strepo ext JSErrorCollector 0
  • 如何正确使用CSS媒体查询进行响应式设计

    我有媒体查询方面的问题 我想要我的主线div宽度为 960 像素 但如果屏幕小于 960 像素 我希望它是任何当前宽度的 80 我只从 960px 中得到 80 而不是从更小的所有东西中得到 80 例如 800px 的 80 700px 的
  • Opencv - 灰度模式与灰度颜色转换

    我正在 opencv 2 4 11 python 2 7 中工作 并正在处理灰色图像 在灰度模式下加载图像并将图像从 BGR 转换为灰度时 我发现了异常行为 以下是我的实验代码 import cv2 path some path to co
  • 为什么 android ImageSpan 会显示我的图片两次(当 setBounds 超过特定的魔法宽度时)?

    这是我将 ImageSpan 放入 EditText 中的代码 public void onActivityCreated Bundle savedInstanceState super onActivityCreated savedIns
  • Swift 2 Tapgesture 中无法识别的选择器

    我最近开始将我的应用程序更新到 Swift 2 0 但我遇到了一个问题 该问题在 SO 上有一百个不同的答案 但似乎都与我的问题无关 这在将应用程序更新到 Swift 2 0 之前有效 但我无法找到对点击手势识别器所做的任何更改 这是我收到