问题可能是 UIKit 不知道如何调用选择器throws
,至少在这种情况下。
请记住,UIKit 将调用此函数来响应点击操作。它不习惯调用这样的函数throws
;显然throw
就 Objective-C 运行时而言,必须更改方法的调用签名。除此之外,如果你的函数proFormulaTapGesture
确实抛出了错误,即使 UIKit 可以捕获错误,它会如何处理该错误?
我不确定你在哪里添加的do
/try
/catch
。但除非它在你的动作函数内proFormulaTapGesture
,我不明白它有什么相关性。我相信您需要实施try
/catch
内部错误处理proFormulaTapGesture
,这样它就可以有效地吞掉误差,这样proFormulaTapGesture
不抛出。
我刚刚自己创建了一个快速测试项目,发现throw
ing 目标操作会给出与您相同的“无法识别的选择器”错误:
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 项目上进行了测试,这是我之前在答案中使用的代码)。