gpt4 book ai didi

ios - 如何向另一个类中的 UIButton 添加操作

转载 作者:行者123 更新时间:2023-11-28 10:34:58 26 4
gpt4 key购买 nike

下面的代码编译正常,但因 unrecognized selector sent to instance 错误而崩溃。

我有一个继承自 UIViewController 的类:

class Controller: UIViewController {
override func viewDidLoad() {
let toolbarWrapper = CustomToolbarWrapper(view: view, target: self)
let toolbar = toolbarWrapper.toolbarView
view.addSubview(toolbar)

... Other code ...

}
}

另一个类只是 UIView 的包装器并包含按钮:

class CustomToolbarWrapper {

var toolbarView: UIView

init(view: UIView, target: Any) {
let height: CGFloat = 80
toolbarView = UIView(frame: CGRect(x: 0, y: view.frame.height - height, width: view.frame.width, height: height))
let button = UIButton()

... Some button layout code ...

button.addTarget(target, action: #selector(CustomToolbar.buttonTapped(_:)), for: .touchUpInside)
toolbarView.addSubview(button)
}

@objc static func buttonTapped(_ sender: Any) {
print("button tapped")
}
}

为了清楚起见,我省略了一大块代码并保留了我认为必要的部分。我认为我的代码不起作用,因为我误解了目标在 addTarget 函数中的工作方式。通常,我只会使用 self 作为按钮操作的目标,所以我只是尝试将 self 从 View Controller 传递到 CustomToolbarWrapperinit 函数。

我还尝试了什么:

将按钮的目标从 target 更改为 self,如下所示:

button.addTarget(self, action: #selector(CustomToolbar.buttonTapped(_:)), for: .touchUpInside)

导致应用程序不再崩溃。然而,相反,我认为该行代码无法执行任何操作(由于某种原因不会引发错误?),因为它试图打印 button.allTargets 甚至 button.allTargets。 count 导致应用程序在编译时崩溃,出现 EXC_BREAKPOINT 错误,并且在控制台或 XCode UI 中没有错误描述(这让我更加困惑,因为我的代码中没有断点!)。

此外,使 buttonPressed(_:) 成为非静态的不会改变前面提到的任何观察结果。

此外,为了确保按钮实际上可以与之交互,我在 ControllerviewDidLoad() 中添加了这个:

for subview in toolbar.subviews? {
if let button = subview as? UIButton {
button.addTarget(self, action: #selector(buttonPressed(_:)), for: .touchUpInside)
}
}

并为按钮添加了一个简单的测试方法到Controller:

@objc func buttonPressed(_ sender: UIButton) {
print("Button Pressed")
}

并且运行代码确实会在控制台日志中打印出“Button Pressed”,因此用户应该能够与该按钮进行交互。

如果您认为这些代码不足以解决问题,请随时告诉我,我会发布更多详细信息。

编辑我更喜欢在 CustomToolbarWrapper 类中保留按钮操作的实现,以防止将来重复代码,因为无论 CustomToolbarWrapper 的实例在哪里,操作都是相同的已创建。

最佳答案

最好的选择是在 Controller 中添加目标,然后在按下按钮时调用 toolbarWrapper 中的方法。但是如果你真的需要保留这个设计,你应该在你的 Controller 类中有一个对你的 toolbarWrapper 的强引用,否则你的 toolbarWrapper 被释放并且什么都不会被调用。此外,buttonTapped(_:) 方法不需要是静态的。因此,在您的 Controller 中:

class Controller: UIViewController {

var toolbarWrapper: CustomToolbarWrapper?

override func viewDidLoad() {
toolbarWrapper = CustomToolbarWrapper(view: view, target: self)
let toolbar = toolbarWrapper.toolbarView
view.addSubview(toolbar)

... Other code ...

}
}

在你的包装器中:

class CustomToolbarWrapper {

var toolbarView: UIView

init(view: UIView, target: Any) {
let height: CGFloat = 80
toolbarView = UIView(frame: CGRect(x: 0, y: view.frame.height - height,width: view.frame.width, height: height))
let button = UIButton()

... Some button layout code ...

button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
toolbarView.addSubview(button)
}

@objc func buttonTapped(_ sender: Any) {
print("button tapped")
}
}

关于ios - 如何向另一个类中的 UIButton 添加操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com