Как перезагрузить заголовок UITableView, используя Swift - PullRequest
0 голосов
/ 06 января 2019

У меня вопрос по поводу моего кода.
Я хочу изменить представление в заголовке UITableView, когда нажимаю кнопку.
Но я не знаю, как сбросить заголовок.
И я также не знаю, как удалить предыдущий вид заголовка и установить новый вид заголовка.
Я хочу переключить вид заголовка, когда нажимаю кнопку.
Есть идеи для меня?
Спасибо.

Я попытался написать пример кода.
А как изменить вид заголовка в функции "btnClicked".

enum ChartType {
    case triangle
    case circle
}

class ViewController: UIViewController {

    let tableView: UITableView = UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()

        let sectionHeader: UIView = creatChartView()
        sectionHeader.backgroundColor = .white
        tableView.tableHeaderView = sectionHeader

        tableView.dataSource = self
        tableView.delegate = self
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 50

        view.addSubview(tableView)

        tableView.snp.makeConstraints { (make) in
            make.top.left.right.bottom.equalToSuperview()
        }
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        if let headerView = tableView.tableHeaderView {

            let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
            var headerFrame = headerView.frame

            //Comparison necessary to avoid infinite loop
            if height != headerFrame.size.height {
                headerFrame.size.height = height
                headerView.frame = headerFrame
                tableView.tableHeaderView = headerView
            }
        }
    }

    func creatChartView(type: ChartType = .circle) -> UIView {

        let view = UIView()

        switch type {
        case .circle:

            let titleLabel: UILabel = { () -> UILabel in
                let ui = UILabel()
                ui.text = "circle"
                ui.textAlignment = .center
                return ui
            }()

            let button: UIButton = { () -> UIButton in
                let ui = UIButton()
                ui.setTitle("Switch type", for: .normal)
                ui.addTarget(self, action: #selector(btnClicked), for: .touchUpInside)
                ui.setTitleColor(.red, for: .normal)
                return ui
            }()

            let circleView = UIView()

            let circlePath = UIBezierPath(arcCenter: CGPoint(x: UIScreen.main.bounds.size.width/2,y: 0), radius: CGFloat(20), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)
            let shapeLayer = CAShapeLayer()
            shapeLayer.path = circlePath.cgPath
            shapeLayer.fillColor = UIColor.clear.cgColor
            shapeLayer.strokeColor = UIColor.red.cgColor
            shapeLayer.lineWidth = 3.0
            circleView.layer.addSublayer(shapeLayer)

            view.addSubview(titleLabel)
            view.addSubview(button)
            view.addSubview(circleView)

            titleLabel.snp.makeConstraints { (make) in
                make.top.left.equalTo(15)
            }

            button.snp.makeConstraints { (make) in
                make.right.equalTo(-15)
                make.width.equalTo(titleLabel.snp.width)
                make.height.equalTo(titleLabel.snp.height)
            }

            circleView.snp.makeConstraints { (make) in
                make.top.equalTo(titleLabel.snp.bottom)
                make.left.right.bottom.equalToSuperview()
                make.height.equalTo(50)
            }

            return view

        case .triangle:

            let titleLabel: UILabel = { () -> UILabel in
                let ui = UILabel()
                ui.text = "triangle"
                ui.textAlignment = .center
                return ui
            }()

            let triangleView = UIView()

            let triangle = TriangleView(frame: CGRect(x: 10, y: 20, width: 25 , height: 30))
            triangle.backgroundColor = .red
            triangleView.addSubview(triangle)

            view.addSubview(titleLabel)
            view.addSubview(triangleView)

            titleLabel.snp.makeConstraints { (make) in
                make.top.left.equalTo(15)
                make.right.equalTo(-15)
                make.height.equalTo(20)
            }

            triangleView.snp.makeConstraints { (make) in
                make.top.equalTo(titleLabel.snp.bottom).offset(5)
                make.left.right.bottom.equalToSuperview()
            }

            return view
        }
    }

    @objc func btnClicked(sender: UIButton) {
        //How to refresh the headerView
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = UITableViewCell()
        cell.textLabel?.text = "Hello \(indexPath.row)"

        return cell
    }


}


class TriangleView : UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func draw(_ rect: CGRect) {

        guard let context = UIGraphicsGetCurrentContext() else { return }

        context.beginPath()
        context.move(to: CGPoint(x: rect.minX, y: rect.maxY))
        context.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
        context.addLine(to: CGPoint(x: (rect.maxX / 2.0), y: rect.minY))
        context.closePath()

        context.setFillColor(red: 1.0, green: 0.5, blue: 0.0, alpha: 0.60)
        context.fillPath()
    }
}

1 Ответ

0 голосов
/ 06 января 2019

Прежде всего вам нужен флаг, чтобы проверить, на каком headerView вы сейчас находитесь.

И внутри этого флага вы можете использовать свойство наблюдателя didSet для перезагрузки tableView всякий раз, когда этот флаг изменяется, что-то вроде этого

var isNewHeaderView = false {
        didSet {
            tableView.reloadData()
        }
    }

Теперь внутри метода делегата viewForHeaderInSection вы можете проверить этот флаг и вернуть headerView желаемое что-то вроде этого,

   func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        if isNewHeaderView {
            return UIView() // first View for header in section
        } else {
            return UIView() // second View for header in section
        }
    }

А внутри вашего действия btn вы можете просто переключать значение флага следующим образом:

 @objc func btnClicked(sender: UIButton) {
      isNewHeaderView = !isNewHeaderView
    }

ОБНОВЛЕНИЕ

В Swift 4.2 вы можете использовать isNewHeaderView.toggle()

Теперь каждый раз, когда ваш UIViewController флаг меняется, он автоматически перезагружает tableView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...