Получите первую букву каждого элемента в двумерном массиве для раздела заголовка и отрегулируйте высоту заголовка - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь получить первую букву первого элемента в двумерном массиве для добавления в качестве заголовка для моего представления таблицы. Код ниже:

    var cityArray = [["NYC, NY", New Hampshire"],["Buffalo, NY]]

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()
    label.backgroundColor = UIColor.flatOrangeColorDark()
    label.textColor = .white
    if searching {
    } else {
            let headerArray = cityArray.compactMap{$0.first?.prefix(1)}
            print("\(headerArray)")
            for i in headerArray {
                label.text = String(i)
                //This returns for all of the headers the last element in headerArray
            }
        } 
    return label
    }

Это возвращает "B" для всех заголовков

Кроме того, я хотел бы, чтобы заголовки исчезали при прокрутке. Это было достигнуто путем выбора табличного представления как сгруппированного. Однако это делает каждую ячейку одинаковой высоты. Я хотел бы сделать заголовок меньше по высоте, чем остальные ячейки. Вот текущий код:

 var tableHeaderHeight = 45

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if searching {
    return 0
    } else {
        return CGFloat(tableHeaderHeight)
    }
  }  

 override func viewDidLoad() {
 super.viewDidLoad()
 cityTableview.rowHeight = 75
 //need to create a dynamic height for the section
 //alternatively using .automaticdimension = true
  }

1 Ответ

1 голос
/ 02 августа 2020

Строка

var cityArray = [["NYC, NY", New Hampshire"],["Buffalo, NY]]

не будет компилироваться из-за отсутствия кавычек. Я не уверен, как именно должен выглядеть ваш массив, но предполагаю, что это может быть

var cityArray = [["NYC, NY", "New Hampshire"],["Buffalo", "NY"]]

Затем вы можете использовать функцию карты, чтобы получить первый элемент, используя first и первый письмо с использованием префикса :

let filteredArray = cityArray.map({$0.first?.prefix(1)})
for firstLetter in filteredArray {
    if let uFirstLetter = firstLetter {
       print(uFirstLetter) // prints N B
    }
}

Обновление : это минимальный рабочий пример, который даст вам N в первом заголовке и B во втором заголовке:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var cityArray = [["NYC, NY", "New Hampshire"],["Buffalo", "NY"]]
    var filteredArray: [String.SubSequence?] = []
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1 //just for simplification purpose, change it according to your needs
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //just for simplification purpose, change it according to your needs
        let cell = UITableViewCell()
        return cell
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let tableView = UITableView()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(tableView)
        tableView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        tableView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
        
        filteredArray = cityArray.map({$0.first?.prefix(1)})
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return cityArray.count
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let label = UILabel()
        label.backgroundColor = .lightGray
        label.textColor = .red
        if let uFirstLetter = filteredArray[section] {
            label.text = uFirstLetter.description
            return label
        } else {
            return nil
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...