ios - 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 方法。任何帮助将不胜感激。
解决方案
代表没有被称为 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
推荐阅读
- date - 知道开始和结束时如何使用谷歌应用程序脚本获取天数
- ios - 在 Metal Shader Vertex 函数中出现错误
- reactjs - 试图传递 event.target.name - TypeError:无法读取未定义的属性“目标”
- javascript - 使用nodejs拆分字符串并转换为json对象
- flutter - 如何在颤动中使用自定义部分标题实现水平列表视图?
- jquery - 如果用户选择了一次,则将来禁用单选按钮选择
- python - 为什么 datetime.today.minute 没有给出实际分钟数?
- amazon-web-services - 有没有办法在多次请求后删除或隐藏对对象的公共访问?
- corda - 如何将 Corda 服务公开给 RPC,尤其是在使用 JPA 的情况下
- css - 使用 mixins 返回媒体查询