For my application, I am working without storyboards. For that reason, I am trying to keep my ViewController clutter free by storing larger functions inside another class and calling them when needed.
For some reason, when I call my functions with #Selector I get a crash stating "Unrecognized selector sent to instance".
When I store my function inside the same ViewController as the #Selector it works just fine.
The Following Code Below Works
View Controller
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(loginRegisterButton)
}
lazy var loginRegisterButton: UIButton = {
let button = UIButton(type: .system)
button.backgroundColor = Color.darkBlue
button.setTitle("Register", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitleColor(UIColor.white, for: .normal)
button.layer.cornerRadius = 5
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.addTarget(self, action: #selector(LoginFunctions.handleLogin), for: .touchUpInside)
return button
}()
@objc func handleLogin() {
print("Logging In!!!")
}
}
What I am trying to achieve
The code below does not work
View Controller
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(loginRegisterButton)
}
lazy var loginRegisterButton: UIButton = {
let button = UIButton(type: .system)
button.backgroundColor = Color.darkBlue
button.setTitle("Register", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitleColor(UIColor.white, for: .normal)
button.layer.cornerRadius = 5
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.addTarget(self, action: #selector(LoginFunctions.handleLogin), for: .touchUpInside)
return button
}()
}
LoginFunctions
import Foundation
import UIKit
class LoginFunctions {
@objc func handleLogin() {
print("Logging In!!!")
}
}
I have been trying to debug this for days with no luck. Any help would be greatly appreciated. Thanks in advance!
There's no reference to your LoginFunctions from your ViewController
. And you pass self
as the target to the button but self
doesn't have a handleLogin
method.
You need to hold and instance of LoginFunctions
in your ViewController
class. Then pass that reference as the target instead of self
.
class ViewController: UIViewController {
let functions = LoginFunctions()
lazy var loginRegisterButton: UIButton = {
let button = UIButton(type: .system)
button.backgroundColor = Color.darkBlue
button.setTitle("Register", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitleColor(UIColor.white, for: .normal)
button.layer.cornerRadius = 5
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.addTarget(functions, action: #selector(LoginFunctions.handleLogin), for: .touchUpInside)
return button
}()
}
To add a target to a class it must contain the func in selector , you may try this to share method between viewControllers
extension UIViewController
{
@objc func handleLogin() {
print("Logging In!!!")
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With