Ios Swift 4:在另一个类内调用函数时发送到实例的无法识别的选择器
对于我的应用程序,我在没有故事板的情况下工作。出于这个原因,我试图通过在另一个类中存储更大的函数并在需要时调用它们来保持ViewController的整洁 出于某种原因,当我使用#Selector调用函数时,会出现一个崩溃,说明“无法识别的选择器发送到实例” 当我将我的函数存储在与#选择器相同的ViewController中时,它工作得很好 以下代码起作用Ios Swift 4:在另一个类内调用函数时发送到实例的无法识别的选择器,ios,swift,selector,Ios,Swift,Selector,对于我的应用程序,我在没有故事板的情况下工作。出于这个原因,我试图通过在另一个类中存储更大的函数并在需要时调用它们来保持ViewController的整洁 出于某种原因,当我使用#Selector调用函数时,会出现一个崩溃,说明“无法识别的选择器发送到实例” 当我将我的函数存储在与#选择器相同的ViewController中时,它工作得很好 以下代码起作用 import Foundation import UIKit class LoginFunctions { @objc func han
import Foundation
import UIKit
class LoginFunctions {
@objc func handleLogin() {
print("Logging In!!!")
}
}
视图控制器
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!!!")
}
}
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
}()
}
我正在努力实现的目标
下面的代码不起作用
视图控制器
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!!!")
}
}
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
}()
}
登录功能
import Foundation
import UIKit
class LoginFunctions {
@objc func handleLogin() {
print("Logging In!!!")
}
}
我已经试着调试了好几天,但都没有成功。任何帮助都将不胜感激。提前谢谢 您的
ViewController
中没有对登录功能的引用。然后将self
作为目标传递给按钮,但是self
没有handleLogin
方法
您需要在您的ViewController
类中保留和引用LoginFunctions
。然后将该引用作为目标传递,而不是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
}()
}
若要将目标添加到必须包含func in选择器的类中,可以尝试在ViewController之间共享此方法
extension UIViewController
{
@objc func handleLogin() {
print("Logging In!!!")
}
}
在您的问题中发布完整准确的错误消息,并指出导致错误的确切代码行。您应该在ViewController中创建另一个方法。将按钮的目标添加到该方法。然后用这种新方法调用你的handleLogin。非常感谢!正是我想要的。我一直认为#选择器功能中的“self”指的是触发动作的按钮。我猜你每天都会学到新东西:)不<代码>按钮是按钮。在指定的目标上调用选择器。如果您想让选择器知道是哪个按钮触发了正在调用的选择器,则需要将该按钮作为参数添加到选择器中。在我的例子中,之所以发生这种情况,是因为我忘记更改自定义类(Main.storyboard)中的模块,因为我将一个项目重新用于一个新项目