我正在使用Swift开发一个iOS应用程序,遇到了UIButton的addTarget无法按预期工作的问题。我试着设置一个按钮来触发一个动作,但由于某种原因,它对点击没有React。我在下面提供了我的代码供参考。
class ErrorMessageView: UIView {
let tryButton = UIButton()
private lazy var buttonView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
private func configureTryButton() {
tryButton.setTitle("Try Again", for: .normal)
tryButton.addTarget(self, action: #selector(self.buttonTapped), for: .touchUpInside)
tryButton.translatesAutoresizingMaskIntoConstraints = false
}
var buttonTapHandler: (() -> Void)?
init() {
super.init(frame: .zero)
configureTryButton()
setupUI()
}
private func setupUI() {
buttonView.addSubview(tryButton)
addSubview(mainStackView)
}
@objc private func buttonTapped() {
buttonTapHandler?()
}
}
extension UIViewController {
func showErrorMessageWithTryButton(tapHandler: @escaping () -> ()) {
DispatchQueue.main.async {
let errorView = self.setupErrorMessageWithButton(tapHandler: tapHandler)
self.view.addSubview(errorView)
}
}
private func setupErrorMessageWithButton(tapHandler: @escaping () -> ()) -> UIView {
let loadingView = UIView(frame: .zero)
DispatchQueue.main.async {
let errorView = ErrorMessageView()
loadingView.addSubview(errorView)
errorView.buttonTapHandler = tapHandler
errorView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
errorView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
errorView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
errorView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20),
errorView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20),
])
}
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.showErrorMessageWithTryButton {
self.reloadPage()
}
}
func reloadPage() {
print("Reload Page")
}
}
我已经遵循了向UIButton添加目标操作的标准设置,但它仍然不起作用。点击按钮不会触发buttonTapped功能。我试图在点击按钮时调用ViewController中的reloadPage函数,但没有发生。
其他信息:
Xcode版本:14.2 iOS版本/设备:16.2 /模拟器iPhone 14 Pro Max
1条答案
按热度按时间sshcrbum1#
问题是UIButton只在没有被任何超级视图裁剪的情况下接收点击事件。
您的
ErrorMessageView
不会尝试调整其子视图的大小或位置。在
setupErrorMessageWithButton
方法中,您对errorView
应用了约束,但没有设置高度。修复这两个问题,使所有的视图都有适当的大小和位置,这样按钮就不会被它的超级视图剪切,按钮点击应该开始工作。
在Xcode中使用视图层次结构调试器将允许您查看裁剪的视图和错误的约束。