为不同的TableViews创建可重用的FooterViewSwift 5

问题描述

我创建了FooterView类:UIView。我用它为我的TableView创建FooterView。但是我也想重用该类在其他TableViews中创建FooterView。当我尝试向setupElements()函数添加参数以在其中传递所需的TableView并根据其更改Label文本时,但是初始化程序不允许我执行此操作。 我怎样才能做到这一点?另外,即使删除了“ private”,Swift也不允许我直接调用setupElements()函数。我的代码

class FooterView: UIView { 
    private var footerLabel: UILabel = {
        ...
    }()

    private func setupElements() {
        addSubview(footerLabel)
        ...
        footerLabel.text = "Table is empty"
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupElements()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
...
class TableViewController: UIViewController {
   private lazy var footerView = FooterView()
   private var array: [String] = []

   func viewDidLoad() {
      super.viewDidLoad()
      setupTableView()
   }

   private func setupTableView() {
      tableView.register(UINib(nibName: "Cell",bundle: nil),forCellReuseIdentifier: LibraryCell.reuseId)
      if array.count == 0 {
         tableView.tableFooterView = footerView
      }
   }
}

extension TableViewController: UITableViewDelegate,UITableViewDataSource {...}

解决方法

经过大量搜索,我解决了我的问题。我删除了初始化,并通过setupFooterView函数(对于VC:UIViewController)创建了FooterView,并将需要的ViewController作为参数传递给其中。代码如下:

class FooterView: UIView {
    private var footerLabel: UILabel = {
        let label = UILabel()
        ...
        return label
    }()

    func setupFooterView(for vc: UIViewController) -> UIView {
        let footerView = UIView()
        footerView.addSubview(footerLabel)
        ...
        if vc is TableViewController {
        footerLabel.text = "..."
        } else if vc is SecondTableViewController {
            footerLabel.text = "..."
        }
        return footerView
    }
}

将FooterView添加到我需要的ViewController中:

...
private lazy var footerView = FooterView()
...
tableView.tableFooterView = footerView.setupFooterView(for: self)