LUExpandableTableView 6.0.0

LUExpandableTableView 6.0.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2023年11月
SPM支持SPM

Laurentiu Ungur维护。



  • Laurentiu Ungur

LUExpandableTableView

UITableView的子类,具有可展开和可收缩的节

Build Status Swift 5 Carthage compatible Swift Package Manager compatible Pod Version Pod Platform Pod License

预览

安装

CocoaPods

CocoaPods是Cocoa项目的依赖管理器。您可以使用以下命令安装它

$ sudo gem install cocoapods

需要CocoaPods 1.7.0+版本。

要使用CocoaPods将LUExpandableTableView集成到您的Xcode项目中,请指定Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'LUExpandableTableView'
end

然后,运行以下命令

$ pod install

Carthage

您可以使用 Carthage 通过将其添加到您的 Cartfile 来安装 LUExpandableTableView

github "LaurentiuUngur/LUExpandableTableView" ~> 5.0

然后运行 carthage update

如果这是您第一次在项目中使用Carthage,您需要通过在Carthage中操作说明来完成一些额外的步骤。

Swift Package Manager

要使用Apple的Swift Package Manager进行集成,请将以下内容添加到您的Package.swift中,作为依赖项

.Package(url: "https://githubLaurentiuUngur/LUExpandableTableView", majorVersion: 5)

以下是一个PackageDescription的示例

import PackageDescription

let package = Package(name: "MyApp",
    dependencies: [
        .Package(url: "https://github.com/LaurentiuUngur/LUExpandableTableView", majorVersion: 5)
    ])

手动

如果您不想使用上述任一依赖项管理器,您可以直接手动将LUExpandableTableView集成到您的项目中。

用法

  • LUExpandableTableView导入您的项目。
import LUExpandableTableView
  • LUExpandableTableView实例注册一个单元格。注册的类必须是UITableViewCell的子类。如果您使用的是Storyboard,此步骤不是必需的。
expandableTableView.register(MyTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
  • LUExpandableTableView实例注册一个头部。注册的类必须是LUExpandableTableViewSectionHeader的子类。请注意,在此步骤中无法使用Storyboard。
expandableTableView.register(UINib(nibName: "MyExpandableTableViewSectionHeader", bundle: Bundle.main), forHeaderFooterViewReuseIdentifier: sectionHeaderReuseIdentifier)
  • 设置为数据源和代理。
expandableTableView.expandableTableViewDataSource = self
expandableTableView.expandableTableViewDelegate = self
  • 实现LUExpandableTableViewDataSourceLUExpandableTableViewDelegate协议。
// MARK: - LUExpandableTableViewDataSource

extension ViewController: LUExpandableTableViewDataSource {
   func numberOfSections(in expandableTableView: LUExpandableTableView) -> Int {
       return 42
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, numberOfRowsInSection section: Int) -> Int {
       return 3
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       guard let cell = expandableTableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as? MyTableViewCell else {
           assertionFailure("Cell shouldn't be nil")
           return UITableViewCell()
       }
       
       cell.label.text = "Cell at row \(indexPath.row) section \(indexPath.section)"
       
       return cell
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, sectionHeaderOfSection section: Int) -> LUExpandableTableViewSectionHeader {
       guard let sectionHeader = expandableTableView.dequeueReusableHeaderFooterView(withIdentifier: sectionHeaderReuseIdentifier) as? MyExpandableTableViewSectionHeader else {
           assertionFailure("Section header shouldn't be nil")
           return LUExpandableTableViewSectionHeader()
       }
       
       sectionHeader.label.text = "Section \(section)"
       
       return sectionHeader
   }
}

// MARK: - LUExpandableTableViewDelegate

extension ViewController: LUExpandableTableViewDelegate {
   func expandableTableView(_ expandableTableView: LUExpandableTableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
       /// Returning `UITableViewAutomaticDimension` value on iOS 9 will cause reloading all cells due to an iOS 9 bug with automatic dimensions
       return 50
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, heightForHeaderInSection section: Int) -> CGFloat {
       /// Returning `UITableViewAutomaticDimension` value on iOS 9 will cause reloading all cells due to an iOS 9 bug with automatic dimensions
       return 69
   }
   
   // MARK: - Optional
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, didSelectRowAt indexPath: IndexPath) {
       print("Did select cell at section \(indexPath.section) row \(indexPath.row)")
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, didSelectSectionHeader sectionHeader: LUExpandableTableViewSectionHeader, atSection section: Int) {
       print("Did select cection header at section \(section)")
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
       print("Will display cell at section \(indexPath.section) row \(indexPath.row)")
   }
   
   func expandableTableView(_ expandableTableView: LUExpandableTableView, willDisplaySectionHeader sectionHeader: LUExpandableTableViewSectionHeader, forSection section: Int) {
       print("Will display section header for section \(section)")
   }
}

要获取更多用法详情,请参阅示例应用程序

问题

  • 在iOS 9上返回 UITableViewAutomaticDimension 会由于iOS 9的自动尺寸bug导致所有单元格重新加载。在iOS 10上则正常工作。

需求

  • Xcode 10.2+
  • Swift 5.0+
  • iOS 9.0+

作者

许可