首页 > 解决方案 > ios - 未触发自定义委托方法

问题描述

我使用以下代码在 TabBarController 中添加了一个圆形按钮

import UIKit

protocol AddButtonProtocol: class {
   func addButtonIsClicked()
}

 class MainTabBar: UITabBar {

     open var buttonDelegate: AddButtonProtocol?
    private var middleButton = UIButton()

    override open func awakeFromNib() {
        super.awakeFromNib()
        setupMiddleButton()
    }

    override open func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if self.isHidden {
            return super.hitTest(point, with: event)
        }

        let from = point
        let to = middleButton.center

        return sqrt((from.x - to.x) * (from.x - to.x) + (from.y - to.y) * (from.y - to.y)) <= 39 ? middleButton : super.hitTest(point, with: event)
    }

    func setupMiddleButton() {
        middleButton.frame.size = CGSize(width: 70, height: 70)
        middleButton.backgroundColor = .blue
        middleButton.layer.cornerRadius = 35
        middleButton.layer.masksToBounds = true
        middleButton.center = CGPoint(x: UIScreen.main.bounds.width / 2, y: 0)
        middleButton.addTarget(self, action: #selector(test), for: .touchUpInside)
        addSubview(middleButton)
    }

    @objc func test() {
        print("add button is clicked")
        buttonDelegate?.addButtonIsClicked()

    }
}

它看起来像这样。

在此处输入图像描述

现在,每当我单击该按钮时,HomeScreenVCViewController都应该触发 in 方法。所以我已经实现了这样的协议和委托。

import UIKit

class HomeScreenVCViewController: UIViewController {
    var addButtonDelegate: MainTabBar!
    override func viewDidLoad() {
        super.viewDidLoad()
        addButtonDelegate?.buttonDelegate = self
    }

}

extension HomeScreenVCViewController: AddButtonProtocol {
    func addButtonIsClicked() {
        print("protocol is working") // Not getting called
    }
}

但它根本不起作用,当我点击那个圆形按钮时,不会触发 addButtonIsClicked 方法。任何帮助将不胜感激。

标签: iosswiftdelegatesuitabbarcontrollerprotocols

解决方案


代表没有被称为 b'cozaddButtonDelegate为零。您没有初始化addButtonDelegate,所以addButtonDelegate对象是nil

解决方案

要么你需要做addButtonDelegate一个,要么你需要在方法@IBOutlet中初始化它。viewDidLoad:

然后只会调用委托。

示例 1

@IBOutlet weak var addButtonDelegate: MainTabBar!

并在 viewDidLoad

addButtonDelegate.buttonDelegate = self

示例 2

创建属性如

var addButtonDelegate: MainTabBar?

在 viewDidLoad 初始化addButtonDelegate

addButtonDelegate = MainTabBar() //or any other initialiser
addButtonDelegate?.buttonDelegate = self

推荐阅读