Проблема доступности в многоразовой TableViewCell - PullRequest
1 голос
/ 12 июня 2019

Проблема в том, что когда ячейки можно использовать повторно, accesibilityLabel не работает и VoiceOver читает ноль или один , когда я переключаюсь на другую ячейку с VoiceOver

Как мне установить значение accessibilityLabel при загрузке новых ячеек?

Я прилагаю свой код

Celda.swift

class Celda: UITableViewCell {
    @IBOutlet weak var label: UILabel!

    func setup(_ number: String) {
        label.text = number
    }

    override var isAccessibilityElement: Bool {
        get {return false }
        set { self.isAccessibilityElement = newValue}
    }


    private var _accessibilityElements: [Any]?

    override var accessibilityElements: [Any]? {
        get {
            if let _accessibilityElements = _accessibilityElements {
                return _accessibilityElements
            }
            var elements = [UIAccessibilityElement]()
            let cellAccessibility = UIAccessibilityElement(accessibilityContainer: self)
            cellAccessibility.accessibilityFrameInContainerSpace = self.contentView.frame
            cellAccessibility.accessibilityLabel = label.text
            cellAccessibility.isAccessibilityElement = true

            elements.append(cellAccessibility)
            _accessibilityElements = elements
            return _accessibilityElements
        }
        set {
            _accessibilityElements = newValue
        }
    }
}

ViewController.swift

class ViewController: UIViewController {

    var elementos = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"];

    @IBOutlet weak var tabla: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tabla.dataSource = self
        tabla.delegate = self
        tabla.reloadData()
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return elementos.count;
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let celda: Celda =  tableView .dequeueReusableCell(withIdentifier: "Celda", for: indexPath) as! Celda
        celda.setup(elementos[indexPath.row])
        return celda
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 900.0
    }
}

Могу ли я установить accessibilityLabel для других ячеек?

Мне нужно масштабируемое решение, которое должно быть UIAccessibilityLabelкто определяет его accessiblityLabel

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Вам нужно установить его внутри cellForRowAt

celda.setup(elementos[indexPath.row],value:"\(indexPath.row)")

func setup(_ number: String,value:String) {
  label.text = number
  label.accessibilityLabel = value
}

Таким образом, каждая очередь перезаписывается на текущий indexPath

0 голосов
/ 03 июля 2019

Мне нужно масштабируемое решение, и именно UIAccessibilityLabel должен определить его собственное accessiblityLabel.

Чтобы достичь своей цели, вам нужно сбросить все свойства ячейки, прежде чем использовать ее для новых обновленных данных: взгляните на prepareForReuse функцию ячейки табличного представления.

... например, если я хочу установить isAccessibilityElement = false только для нечетных ячеек

Вставьте фрагменты кода ниже в Celda.swift first:

func setup(_ number: String, a11y isA11y: Bool) {
    label.text = number
    isAccessibilityElement = isA11y
}

override func prepareForReuse() {
    super.prepareForReuse()

    _accessibilityElements = nil
    _isAccessibilityElement = false
    label.text = "NADA"
}

private var _isAccessibilityElement: Bool?

override var isAccessibilityElement: Bool {
    get { return _isAccessibilityElement ?? false  }
    set { _isAccessibilityElement = newValue }
}

private var _accessibilityElements: [Any]?

override var accessibilityElements: [Any]? {
    get {
        if let _accessibilityElements = _accessibilityElements {
            return _accessibilityElements
        }
        var elements = [UIAccessibilityElement]()
        let cellAccessibility = UIAccessibilityElement(accessibilityContainer: self)
        cellAccessibility.accessibilityFrameInContainerSpace = self.contentView.frame
        cellAccessibility.accessibilityLabel = label.text
        cellAccessibility.isAccessibilityElement = self.isAccessibilityElement

        elements.append(cellAccessibility)
        _accessibilityElements = elements
        return _accessibilityElements
    }
    set { _accessibilityElements = newValue }
}

... и в ViewController.swift :

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

    let celda: Celda =  tableView .dequeueReusableCell(withIdentifier: "Celda",
                                                       for: indexPath) as! Celda

    let isA11yCell = (Int(elementos[indexPath.row])! % 2) == 0 ? true : false

    celda.setup(elementos[indexPath.row],
                a11y: isA11yCell)
    return celda
}

Могу ли я установить accessibilityLabel для других ячеек? Мне нужно масштабируемое решение ...

Это решение является масштабируемым, и вы можете адаптировать его содержимое к среде вашего приложения.

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