Индикатор активности Swift 5 не отображается - PullRequest
0 голосов
/ 07 апреля 2020

Я проверил другие вопросы / ответы, но ни один из них не работает для меня.

У меня есть много контроллеров представления, которые загружают данные из базы данных во время подготовки к переходу. Поэтому я поместил индикатор активности следующим образом:

fun c tableView / collectionView (didSelectRow / item) {...

self.showSpinner()
self.performSegue(...) -> prepare(for segue...)  : data gets loaded
self.removeSpinner()

}

с функции определены в

import UIKit

var aView : UIView?

extension UIViewController{

    func showSpinner(){
        aView = UIView(frame: self.view.bounds)
        aView?.backgroundColor = UIColor(white: 0, alpha: 0.5)

        let ai = UIActivityIndicatorView(style: .large)
        ai.center = aView!.center
        ai.color = .red
        ai.startAnimating()
        aView?.addSubview(ai)
        self.view.addSubview(aView!)

        Timer.scheduledTimer(withTimeInterval: 20, repeats: false, block: {_ in self.removeSpinner()})
    }

    func removeSpinner(){

        aView?.removeFromSuperview()
        aView = nil
    }
}

код выполняется (я проверял это), но нет никаких признаков вращения или представления с более темным фоном.

Даже если я определю

var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

и поставлю

activityIndicator.startAnimating()
performSegue...
activityIndicator.stopAnimating()

, то ничего не произойдет. В иерархии представления нет новых элементов (ожидается: представление с индикатором активности или только индикатор активности). Что не так?

ОБНОВЛЕНИЕ:

если я вызову его в

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        self.showSpinner()  //show indicator
        return indexPath

, весь код (willSelect, DidSelect, Segue) будет выполнен, и только тогда для 1 / 10 se c вижу ли я счетчик при переходе к следующему виду. Мне нужно, однако, чтобы счетчик показывался ДО того, как будет выполнен следующий код DidSelect

1 Ответ

0 голосов
/ 07 апреля 2020

Спасибо Bear Cahill от Accelebrate! Вот решение:

Проблема заключалась в том, что было сказано показать прядильщик и выполнить переход. Он не делает этого, пока функция не завершится. Как только функция завершается, она выполняет оба действия, поэтому пока она не выполняет переход, покажет счетчик. Вы знаете, что он показывает b / c, когда вы go вернулись, он там. Таким образом, вам нужно вызвать show spinner и разрешить элементу управления go вернуться к выполнению l oop (пусть функция fini sh), а затем вызов THEN для выполнения передачи данных и т. Д. c. Я бы порекомендовал, возможно, использовать Timer: чтобы вы вызывали showSpinner, затем запускали таймер, а в теле таймера вызывали запрос выполнения. Таким образом, функция завершится, будет показан счетчик, а затем будет вызван segue. Просто установите таймер на 0,01 секунды.

...