为什么委托模式不适用于 TabBarController 的自定义视图?

问题描述

我正在创建一个项目并使用故事板为我的 VC 创建一个标签栏控制器。 然后在第一个控制器中,我隐藏标签栏并向标签添加自定义视图。

self.tabBarController?.view.addSubview(customTabBarView)

这个自定义视图有一个视图,其中包含带有三个按钮的堆栈视图,对于交互,我实现了委托模式,但是,这不起作用,我不明白为什么。我做错了什么?如果我在 VC 中创建这个视图但不像自定义视图类,这是否有效?

我做这个“技巧”是因为不想为我的标签栏创建自定义形状。我的想法是隐藏标签栏控制器,然后添加带有标签栏下方按钮的自定义视图,并使用按钮在控制器之间切换。

我的自定义视图:

import UIKit

protocol GeneralViewButtons {
    func pressButton(number: Int)
}

class GeneralView: UIView {

    var delegate: GeneralViewButtons?

    var width: CGFloat!
    var height: CGFloat!
    var Yposition: CGFloat!
    var Xposition: CGFloat!
    
    lazy var TabBar: UIView = {
        let fillColor = UIColor(red: 0.118,green: 0.118,blue: 0.149,alpha: 1.000)
        
        let viewGeneral = UIView()
        viewGeneral.frame = CGRect(x: Xposition,y: Yposition - height - (Xposition + (Xposition / 2)),width: width - (Xposition * 2),height: height)
        viewGeneral.backgroundColor = fillColor
        
        viewGeneral.layer.cornerRadius = 20
        viewGeneral.clipsToBounds = true
        viewGeneral.layer.shadowColor = UIColor.gray.cgColor
        viewGeneral.layer.shadowOpacity = 1.0
        viewGeneral.layer.shadowOffset = CGSize(width: 0,height: 0)
        viewGeneral.layer.shadowRadius = 10
        viewGeneral.layer.masksToBounds = false
        
        return viewGeneral
    }()
    
    lazy var stack: UIStackView = {

        let stack = UIStackView()
        stack.frame = CGRect(x: 0,y: 0,height: height)

        stack.layer.borderWidth = 1
        stack.layer.borderColor = #colorLiteral(red: 1.0,green: 1.0,blue: 1.0,alpha: 1.0)
        stack.spacing = 30
        stack.distribution = .fillEqually
        stack.axis = .horizontal
        
        stack.addArrangedSubview(but1)
        stack.addArrangedSubview(but2)
        stack.addArrangedSubview(but3)

        return stack
    }()
    
    lazy var but1: UIButton = {
        let but = UIButton(frame: CGRect(x: 0,width: 50,height: 50))
        but.backgroundColor = .red
        
        but.addTarget(self,action: #selector(click1(_:)),for: .touchUpInside)
        return but
    }()
    
    lazy var but2: UIButton = {
        let but = UIButton(frame: CGRect(x: 0,height: 50))
        but.backgroundColor = .green
        
        but.addTarget(self,action: #selector(click2(_:)),for: .touchUpInside)
        return but
    }()
    
    lazy var but3: UIButton = {
        let but = UIButton(frame: CGRect(x: 0,height: 50))
        but.backgroundColor = .blue
        
        but.addTarget(self,action: #selector(click3(_:)),for: .touchUpInside)
        return but
    }()
    
    init(frame: CGRect,x: CGFloat,y: CGFloat,width: CGFloat,height: CGFloat) {
        self.width = width
        self.height = height
        self.Yposition = y
        self.Xposition = x
        
        super.init(frame: frame)
        
        self.addSubview(TabBar)
        self.TabBar.addSubview(stack)
        
        
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    @objc func click1(_ sender: UIButton) {
        delegate?.pressButton(number: 1)
    }
    
    @objc func click2(_ sender: UIButton) {
        delegate?.pressButton(number: 2)
    }
    
    @objc func click3(_ sender: UIButton) {
        delegate?.pressButton(number: 3)
    }
    
}

我的第一个风投:

import Foundation
import UIKit

class HomeVC: UIViewController,GeneralViewButtons {
    
    var customTabBarView: GeneralView!
    
    override func viewDidLoad() {
        self.view.backgroundColor = .blue
        createGradientLayer()
        hideTabBar()
        setupView()
        
    }
    //MARK: Delegate
    func pressButton(number: Int) {
        print(number)
    }

    
    func setupView() {
        customTabBarView = GeneralView(frame: CGRect(x: 0,width:0,height: 0),x: 20,y: UIScreen.main.bounds.maxY,width: UIScreen.main.bounds.width,height: 70)
        
        self.tabBarController?.view.addSubview(customTabBarView)
        
    }
    
    func createGradientLayer() {
        GeneralSettings.shared.background(mainView: self.view)
    }
    
    func hideTabBar() {
        self.tabBarController?.tabBar.isHidden = true
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)