为不同的表视图创建可重用的页脚视图(Swift 5)

Posted

技术标签:

【中文标题】为不同的表视图创建可重用的页脚视图(Swift 5)【英文标题】:Creating reusable FooterView for different TableViews (Swift 5) 【发布时间】:2020-08-20 11:36:04 【问题描述】:

我创建了类FooterView:UIView。我用它为我的 TableView 创建 FooterView。但我也想重用这个类在我的其他 TableViews 中创建 FooterView。当我尝试向 setupElements () 函数添加一个参数以在那里传递所需的 TableView 并根据它更改标签文本时,但初始化程序不允许我这样做。 我怎样才能做到这一点?此外,即使我删除了“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 ...

【问题讨论】:

"pass the required TableView" -- 没有意义...为什么要尝试将 tableView 引用传递给FooterView“Swift 不允许我直接调用 setupElements() 函数,即使我删除了“private””——也没有任何意义。显示您的实际代码...您发布的内容甚至没有 tableView 这是 TableView 所在的常用 ViewController。将此添加到问题的正文中。我只想放置 FooterView 并让它的 footerLabel 有不同的字符串值,具体取决于它是哪个 TableView:TableViewOne 或 TableViewTwo 等等。我可以为每个 TableView 创建不同的 FooterView 类,但这不合理,我想重用一个类。现在清楚了吗?)) 你是说你有两个(或更多)tableViews 作为子视图添加到你的UIViewController 的视图中?或者您是说您在应用程序的某个位置有一个UITableViewController,在另一个位置有一个不同的UITableViewController,等等? 是的,我的应用程序的一个地方有一个 UITableViewController,另一个地方有一个不同的 UITableViewController。 【参考方案1】:

经过大量搜索,我解决了我的问题。我删除了初始化并通过 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)

【讨论】:

以上是关于为不同的表视图创建可重用的页脚视图(Swift 5)的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的表视图页脚

在所有应用程序界面swift2中保持底部视图(如页脚)[关闭]

在 Swift 中创建可重用视图并添加完成处理程序

从 NavigationController 以编程方式初始化可重用的表视图控制器

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

用于可重用视图的 iOS Swift UICollectionView registerNib 不起作用