Вид индикатора активности в ячейке таблицы - PullRequest
0 голосов
/ 28 мая 2019

У меня есть таблица, я хочу сделать так, чтобы при нажатии на ячейку вращался индикатор активности, а не где-то в непонятном месте

enter image description here

Похоже на это. В коде у меня есть модуль MainViewController и модуль Presenter, который определяет, когда следует запускать индикатор активности. У меня есть розетка

@IBOutlet weak var activity: UIActivityIndicatorView! = UIActivityIndicatorView(style: .gray)

У меня есть две функции в контроллере вида, которые запускают анимацию и останавливают

func startActivity() {
   activity.startAnimating()
}


func stopActivity() {
   activity.stopAnimating()
}

есть функция, которая обрабатывает щелчок по ячейке

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   tableView.deselectRow(at: indexPath, animated: true)
   output.callFromThePresenter(array: array[indexPath.row])

}

Эта функция реализована в презентере.

func callFromThePresenter(array: String) {

  let userInteractiveQueue = DispatchQueue.global(qos: .userInteractive)

  async {
    DispatchQueue.main.async  {
        self.view.startActivity()
    }
    userInteractiveQueue.async {
         self.interactor.functionFromInteractor(data: array)
    }
  }
}

как я и предполагал, в контроллере представления при нажатии на ячейку будет работать функция callFromThePresenter (), и в ней будут запускаться функция анимации и функция передачи данных в Interactor, как только Interactor получит выполнив эту функцию, он вернет данные в Presenter, а внутри функции обратного вызова я запустите функцию stopActivity (). И это работало, пока я не решил установить позиционирование

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   tableView.deselectRow(at: indexPath, animated: true)
   output.callFromThePresenter(array: array[indexPath.row])
   let cell = tableView.cellForRow(at: indexPath)
   cell?.accessoryView = self.activity
}

как только я добавил эти две строки

let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryView = self.activity

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

1 Ответ

0 голосов
/ 28 мая 2019

Простой пример:

  • В Интерфейсном Разработчике установите Style ячейки табличного представления на custom.
  • Перетащите метку и индикатор активности в ячейку ипри необходимости установите соответствующие ограничения.
  • Выберите индикатор активности, нажмите ⌘⌥4 (Инспектор атрибутов) и отметьте Скрывает при остановке .
  • Создайте пользовательский класс, подкласс UITableViewCell в проекте

    class TitleCell: UITableViewCell {
    
        @IBOutlet weak var titleLabel: UILabel!
        @IBOutlet weak var activity: UIActivityIndicatorView!
    
        var isRunning : Bool = false {
            didSet {
                isRunning ? activity.startAnimating() : activity.stopAnimating()
            }
        }
    }
    
  • Установите класс ячейки прототипа в Интерфейсном Разработчике на TitleCell и подключите метку иуказатель на IBOutlets

  • Создайте модель данных как минимум со свойством title и isRunning.

    struct Model {
        let title: String
        var isRunning : Bool
    }
    
  • Объявите массив источника данных

    var items = [Model]()
    
  • В cellForRow обновите элементы пользовательского интерфейса (замените идентификатор своим реальным идентификатором)

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TitleCell
        let item = items[indexPath.row]
        cell.titleLabel!.text = item.title
        cell.isRunning = item.isRunning
        return cell
    }
    
  • Для запуска и остановки навесного оборудования didSelectRow

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: false)
        items[indexPath.row].isRunning.toggle()
        tableView.reloadRows(at: [indexPath], with: .none)
    }
    

Для изменения состояния индикатора используйтеВсегда шаблон для установки isRunning в модели и перезагрузите строку.

...