ios UITableView由模型属性的首字母确定的按字母顺序排列的标题部分

mfuanj7w  于 2023-02-06  发布在  iOS
关注(0)|答案(1)|浏览(197)

我尝试创建一个UITableView,其标题按照Company模型的businessName属性的首字母按字母顺序排列,如果集合中没有以字母开头的公司,则隐藏标题部分。但我很难将公司限制在正确的部分,然后隐藏没有businessName首字母的部分。

//现状

//我在寻找什么

//公司模型

`struct Company {

var uid: String
var businessAddress: String
var businessName: String

init(dictionary: [String : Any]) {
    self.uid = dictionary["uid"] as? String ?? ""
    self.businessAddress = dictionary["businessAddress"] as? String ?? ""
    self.businessName = dictionary["businessName"] as? String ?? ""
}

}`

//服务

`struct EmployeeService {

static func fetchCompanies(completion: @escaping([Company]) -> Void) {
    
    var companies = [Company]()
    
    let query = REF_COMPANIES.order(by: "businessName")
    
    query.addSnapshotListener { snapshot, error in
        snapshot?.documentChanges.forEach({ change in
            let dictionary = change.document.data()
            let company = Company(dictionary: dictionary)
            companies.append(company)
            companies.sort {
                $0.businessName < $1.businessName
            }
            completion(companies)
        })
    }
    
}

}`

//公司选择控制器

`class CompanySelectionController: UIViewController {

// MARK: - Properties

var companies = [Company]()

let sectionTitles = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".map(String.init)

}

// MARK: - UITableViewDataSource

extension CompanySelectionController: UITableViewDataSource {

func numberOfSections(in tableView: UITableView) -> Int {
    return sectionTitles.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return companies.count
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // Create the header view
    let headerView =  UIView.init(frame: CGRectMake(0, 0, self.view.frame.size.width, 40))
    headerView.backgroundColor = UIColor.groupTableViewBackground
    
    // Create the Label
    let label = UILabel(frame: CGRectMake(10, -40, 120, 60))
    label.font = UIFont(name: "AvenirNext-DemiBold", size: 16)
    label.textAlignment = .left
    label.text = sectionTitles[section]
    
    // Add the label to your headerview
    headerView.addSubview(label)
    
    return headerView
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 5
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifiers.CompanySelectionCell, for: indexPath) as! CompanySelectionCell
    
    cell.selectionStyle = .none
    cell.company = companies[indexPath.row]
    return cell
}

}`

//公司选择单元格

`protocol CompannyViewModelItem {
var type: CompannyViewModelItemType { get }
var rowCount: Int { get }
var sectionTitle: String { get }
}

class CompanySelectionCell: UITableViewCell {

// MARK: - Properties

var company: Company! {
    didSet {
        configure()
    }
}

private let businessNameLabel: UILabel = {
    let label = UILabel()
    label.font = UIFont(name: "AvenirNext-DemiBold", size: 14)
    label.textColor = .black
    label.textAlignment = .left
    return label
}()

private let businessAddressLabel: UILabel = {
    let label = UILabel()
    label.font = UIFont(name: "AvenirNext-MediumItalic", size: 12)
    label.textColor = .darkGray
    label.textAlignment = .left
    return label
}()

lazy var businessStack = UIStackView(arrangedSubviews: [businessNameLabel, businessAddressLabel])

// MARK: - Lifecycle

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

// MARK: - Helper Functions

fileprivate func configure() {
    
    guard let company = company else { return }
    let viewModel = CompannyViewModel(company: company)
    
    businessNameLabel.text = viewModel.businessName
    businessAddressLabel.text = viewModel.businessAddress
    
}

}`

//公司视图模型

enum CompannyViewModelItemType { case uid case businessName }
我已经尝试过更改viewForHeaderInSection中的label属性,以尝试与正确的字母保持一致,但问题的屏幕截图是我所做的最大努力。

yeotifhr

yeotifhr1#

问题出在UITableView的数据源上,我们使用的实际上是一个静态结构,有26个部分(全是字母),并且我们在每一个部分后面附加了所有的公司,具体如下:

func numberOfSections(in tableView: UITableView) -> Int {
    return sectionTitles.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return companies.count
}

为了显示您实际想要的内容,您需要一个不同的数据结构,如嵌套的Array来填充您的表视图。

let dataSource: [String: [Company]] = // however you want to read the data in here 

func numberOfSections(in tableView: UITableView) -> Int {
    dataSource.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    datasource[section].count
}

要创建数据源,您需要遍历所有的公司,只填写实际存在的公司的字母(部分)。
编辑:我强烈推荐您使用AutoLayout来创建视图

相关问题