I am fairly new to Swift, I am writing a plugin for a hybrid App (Cordova).
I managed to have the App rootController display a ViewController with a game inside and a separate UIView header at the top that contains a UILabel as a back button.
I am experiencing a crash as soon as I tap on the back button.
What am I doing wrong?
import SomeFramework;
@objc (MyIntegration) class MyIntegration : SomeFrameworkDelegate {
func implementedFunctionForDelegate(_ controller: FwViewController) {
print("fwViewControllerDidHandleSomeEvent");
}
// ...
@objc(launchGame:)
func launchGame() {
// Prep params
let params = FwLaunchParameters.init()
params.gameId = gameId
// ViewController init
let gameController = FwViewController.init(gameLaunchParameters: params)
gameController.delegate = self
// Display game using rootViewController
let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.rootViewController?.present(gameController, animated: true, completion: nil)
let backHomeHeader = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 80.0))
let label = UILabel(frame: CGRect(x: 0, y: 28, width: 200, height: 50))
label.text = "u{3008} Back Home"
label.isUserInteractionEnabled = true
let gestureRecognizer = UITapGestureRecognizer(target: currentWindow?.rootViewController, action: Selector("handleTap"))
label.addGestureRecognizer(gestureRecognizer)
handleTap() // prints out the log as expected
// Display header
currentWindow?.addSubview(backHomeHeader)
backHomeHeader.addSubview(label)
}
@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
print("tapped! yay!")
}
}
Error log right before the crash:
2021-07-31 01:17:24.790750-0400 MyApp[53004:2197131] -[MainViewController handleTap]: unrecognized selector sent to instance 0x7fdb44906490
2021-07-31 01:17:24.842133-0400 MyApp[53004:2197131] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MainViewController handleTap]: unrecognized selector sent to instance 0x7fdb44906490'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff20422fba __exceptionPreprocess + 242
1 libobjc.A.dylib 0x00007fff20193ff5 objc_exception_throw + 48
Note: I use UIApplication.shared.keyWindow
because it’s a hybrid App (Cordova) and I’m writing a plugin that allows some Javascript code to launch an html5 game using Apple On-Demand Resources.
Everything works fine except for the Back Home button…
2
Answers
The crash says that the
MainViewController
has no method with the namehandleTap
It seems
currentWindow?.rootViewController
isMainViewController
and thehandleTap
function is inMyIntegration
class.So pass in
self
as the target or implement thehandleTap
inside theMainViewController
for this case.Target
is an object to whichaction
should be sent. You need to movehandleTap
to yourFwViewController
or to replace target withself
, like this:Also always prefer
#selector
toSelector
because it’ll give you an error if you’re using a wrong selector.