ios UIButton的addTarget在Swift中不起作用

xam8gpfp  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(156)

我正在使用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

sshcrbum

sshcrbum1#

问题是UIButton只在没有被任何超级视图裁剪的情况下接收点击事件。
您的ErrorMessageView不会尝试调整其子视图的大小或位置。
setupErrorMessageWithButton方法中,您对errorView应用了约束,但没有设置高度。
修复这两个问题,使所有的视图都有适当的大小和位置,这样按钮就不会被它的超级视图剪切,按钮点击应该开始工作。
在Xcode中使用视图层次结构调试器将允许您查看裁剪的视图和错误的约束。

相关问题