Добавьте пользовательский класс в UIView в UITableView - PullRequest
0 голосов
/ 03 марта 2019

Я сделал иконку с помощью приложения Paint Code:

class addIconView: UIView {
    override func draw(_ rect: CGRect) {
      TodayIcon.draw(frame: rect)
    }
 }

Я также добавил конфигурацию ячеек в другом классе:

class OptionsTableCell {
    var icon: UIView
    var label: String

    init(icon: UIView, label: String) {
        self.icon = icon
        self.label = label
    }
}

Затем я добавил UIView впрототип ячейки в TableView.Я использовал этот массив для обновления значков ячейки:

var optionsArray: [OptionsTableCell] = []

func createOptionsArray() -> [OptionsTableCell] {

    var cell: [OptionsTableCell] = []

    let addIcon = OptionsTableCell(icon: addIconView(), label: "Add")

    cell.append(addIcon)

    return cell
}

Я просто добавил addIconView (), чтобы обновить значок ячейки.Я думаю, что это неправильно.

Как я могу обновить пользовательский класс UIView, чтобы изменить значок внутри него?

1 Ответ

0 голосов
/ 03 марта 2019

Вместо использования универсального UIView в ячейке, создайте подкласс его в новый класс, который инкапсулирует типы отображаемых значков.Рассмотрим этот пример:

UIView подкласс, который инкапсулирует логику значков вокруг PaintCode.Обратите внимание на перечисление Option и свойство @IBDesignable (допускает рендеринг в реальном времени в Interface Builder):

import UIKit

@IBDesignable class OptionsView: UIView {

    // MARK: - Properties

    // Allowed options.
    enum Option {
        case star, tree
    }

    // Option that should currently be displayed. Default is .star (for no particular reason).
    var currentOption: Option = .star {
        didSet {
            setNeedsDisplay() // Force redrawing.
        }
    }

    // MARK: - Lifecycle

    override func draw(_ rect: CGRect) {
        drawIcon(rect)
    }
}

// MARK: - Private

private extension OptionsView {

    /// Logic to decide which icon to display.
    func drawIcon(_ rect: CGRect) {
        switch currentOption {
        case .star:
            StyleKit.drawStarIcon(frame: rect)
        case .tree:
            StyleKit.drawTreeIcon(frame: rect)
        }
    }
}

Конфигурация раскадровки: пользовательская UITableViewController + пользовательская UITableViewCell с пользовательской UIView (обратите внимание на атрибут class типа OptionsView):

setup

Подключите UILabel и OptionsView к вашему CustomCell.Пример реализации (обратите внимание на var option):

import UIKit

class CustomCell: UITableViewCell {

    // MARK: - Public  Properties

    // Option that should currently be displayed. Default is .star (for no particular reason).
    var option: OptionsView.Option = .star {
        didSet {
            iconView.currentOption = option
            updateLabelText()
        }
    }

    // MARK: - Private Properties

    @IBOutlet private weak var iconView: OptionsView!
    @IBOutlet private weak var label: UILabel!
}

// MARK: - Private

private extension CustomCell {

    func updateLabelText() {
        switch option {
        case .star:
            label.text = "Star"
        case .tree:
            label.text = "Tree"
        }
    }
}

Наконец, в вашем пользовательском UITableViewController:

import UIKit

class TableViewController: UITableViewController {

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1 // Hardcoded in this example.
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 40 // Hardcoded in this example.
    }

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

        if let customCell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as? CustomCell {

            // Logic around which option to display
            if indexPath.row < 20 {
                customCell.option = .star
            } else {
                customCell.option = .tree
            }

            return customCell
        }

        // Fallback.
        return UITableViewCell()
    }
}

Окончательный результат:

example

См. Этот проект для всего кода (шестой тест):
https://github.com/backslash-f/paintcode-tests

...