UITableView Перезагрузка не обновляет табличное представление с DispatchQueue.main.async - PullRequest
0 голосов
/ 22 мая 2018

Я написал код с swift4 и запущен на симуляторе iPhone.

DispatchQueue.main.async {
     self.view.activityindicatorStop()
     self.mytableView.reloadData()
}

Над кодом есть следующая операция

Индикатор остановки активности и обновление TableView после заполнения данных массивом.

Но ожидаемого не происходит ..

Я получил следующее

  1. Индикатор активности остановлен, но индикатор не удален, а фоновый вид не удален.
  2. TableView не обновляется.

код, который я использовал:

 super.viewDidLoad()


        UserDefaults.lastAccessDate = Date()


        self.view.activityStartAnimating(activityColor: #colorLiteral(red: 0.9176470588, green: 0.2901960784, blue: 0.262745098, alpha: 1), backgroundColor: #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0))

       //Calling the API  
      Capsulle.retriveSpaceTimeCapsulle { (data, respose, error) in
        if nil == error
        {
         let ServerData = serverComm.toJSONObject(with: data!)
         let result = ServerData.0 as? Array<Dictionary<String, Any>>
         self.capsulleDetail = result

        if (result == nil)
        {
            if false ==  loginCredential.isHavingAccessToken
            {
            loginCredential.isHavingAccessToken = false;
            UserDefaults.standard.set( "", forKey: "UserEmailID")
            let objStoryBoard:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
            let initialViewController:UIViewController = objStoryBoard.instantiateViewController(withIdentifier: "loginVC")

            self.present(initialViewController, animated: true, completion: {

            })

            return
            }
        }


         DispatchQueue.main.sync {

            self.CapsulleCollectionView.reloadData()

            self.view.activityStopAnimating()

         }
         }

      }

    }

func activityStartAnimating(activityColor: UIColor, backgroundColor: UIColor) {
        let backgroundView = UIView()
        backgroundView.frame = CGRect.init(x: 0, y: 0, width: self.bounds.width, height: self.bounds.height)
        backgroundView.backgroundColor = backgroundColor
        backgroundView.tag = 475647

        var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
        activityIndicator = UIActivityIndicatorView(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
        activityIndicator.center = self.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
        activityIndicator.color = activityColor
        activityIndicator.startAnimating()
        self.isUserInteractionEnabled = false

        backgroundView.addSubview(activityIndicator)

        self.addSubview(backgroundView)
    }

func activityStopAnimating() {
    if let background = self.viewWithTag(475647){

        background.removeFromSuperview()
    }
    self.isUserInteractionEnabled = true
}

Я создал ActivityStopAnimating и ActivityStartAnimating как расширения

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Для перезагрузки tableView вы должны убедиться, что self.capsulleDetail изменили данные, если этот массив является вашим источником данных, я думаю, что он не изменился или все еще равен нулю, поэтому reloadData () ничего не сделает

Чтобы скрыть индикатор , вы должны установить это свойство, чтобы скрыть его при остановке, или скрыть его напрямую с помощью sting is-hidden to true

self.activityIndicator.hidesWhenStopped = true
0 голосов
/ 23 мая 2018

Я не нахожу правильных решений, чтобы сделать это идеально ..

после долгого пути я решил сделать следующее, и это работает так, как я ожидаю ..

DispatchQueue.main.async {
                        // now update UI on main thread

                        self.myTableView.reloadData()
                        self.myTableView.setContentOffset(CGPoint(x: 0, y: -1), animated: true)
                        self.view.activityStopAnimating()

                    }

Спасибо за все ваши ответы .. я жду идеального ответа ..

0 голосов
/ 22 мая 2018
DispatchQueue.main.async {
    self.view.activityIndicator.stopAnimating()
    self.view.activityIndicator.isHidden = true
    self.mytableView.beginUpdates()
    self.mytableView.endUpdates()
}

ваш код должен работать для перезагрузки tableView, но вы также можете попробовать использовать beginUpdates() и endUpdates() метод.и чтобы остановитьActivityindicator, позвоните stopAnimating(), а затем скройте свой индикатор активности, этот код должен работать для вас

Наслаждайтесь кодированием.

...