UITableView reloadData not working when viewcontroller is loaded a 2nd time

Viewed 1633

I have a UITableView with custom cell displaying a list of files that can be downloaded. The cell displays the filename and download status. Everything working fine except one scenario :

  1. The user downloads a file and navigates back to the home screen while file download in progress...
  2. He comes back to the previous screen. File download still in progress.
  3. File download complete. I am using tableview.reloadData() at this point to refresh the download status to "Download Complete" but reloadData() not working in this scenario. The cell label still shows "Download in progress".

Scrolling the tableview to get the cell out of screen and back refreshes the cell correctly. Anyway to do this programmatically?"

Otherwise, in normal case where user doesn't change screen, reloadData() is working fine.

Any idea how to fix this?

Thanks

I have used alamofire download with progress in the function below which is inside my UIViewController.

func DownloadFile(fileurl: String, indexPath: NSIndexPath, itemPath: String, itemName: String, itemPos: String, ItemSelected:Bool) {

      let cell = myTableView.cellForRowAtIndexPath(indexPath) as! myCustomCell

      let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)


        Alamofire.download(.GET, fileurl, destination: destination)


       .progress {bytesRead, totalBytesRead, totalBytesExpectedToRead in


            // This closure is NOT called on the main queue for performance
            // reasons. To update your ui, dispatch to the main queue.
            dispatch_async(dispatch_get_main_queue()) {
                print("Total bytes read on main queue: \(totalBytesRead) / \(totalBytesExpectedToRead)")


                let progress = Int((Double(totalBytesRead)/Double(totalBytesExpectedToRead)) * 100)


                cell.lblMoreRuqyaFileInfo.text = "Downloading file...(\(progress)%)"


            }
        }
         .response { _, _, _, error in

           if let error = error {
                print("\(error)")
                cell.lblMoreRuqyaFileInfo.text = "Failed to download file. Please try again."
            } else {


            cell.lblMoreRuqyaFileInfo.text = "File Downloaded sucessfully"

          //reloadData() not working from here
            self.myTableView.reloadData()

            }

    }

}

The above func is being called in the tableview's editActionsForRowAtIndexPath below.

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

    if myTableView.cellForRowAtIndexPath(indexPath) == nil {
        let action = UITableViewRowAction()
          return [action]

    }

    let cell = myTableView.cellForRowAtIndexPath(indexPath) as! myCustomCell

    let fileurl = cell.textLabel!.text
    let ruqyainfo = cell.lblMoreRuqyaFileInfo.text

    let sItemPath = cell.lblCompiledRuqya.text! + "->" + cell.textLabel!.text! + "->\(indexPath.section)->\(indexPath.row)"
    let sItemName = cell.lblCompiledRuqya.text!
    let sItemPos = "->\(indexPath.section)->\(indexPath.row)"
    var bItemSelected:Bool = false
    if myTableView.cellForRowAtIndexPath(indexPath)?.accessoryType == UITableViewCellAccessoryType.Checkmark {
        bItemSelected = true
    } else {

        bItemSelected = false
    }

     //check if file already downloaded,return empty action, else show Download button
    if ruqyainfo?.containsString("Download") == false {
        let action = UITableViewRowAction()
         return [action]

    }


    let line = AppDelegate.dictCompiledRuqya.mutableArrayValueForKey(AppDelegate.dictCompiledRuqya.allKeys[indexPath.section] as! String)

    let name = line[indexPath.row].componentsSeparatedByString("#")

    let DownloadAction = UITableViewRowAction(style: .Normal, title: "Download\n(\(name[3]))") { (action: UITableViewRowAction!, indexPath) -> Void in

            self.myTableView.editing = false

            AppDelegate.arrDownloadInProgressItem.append(name[0])

            self.DownloadFile(fileurl!, indexPath: indexPath, itemPath: sItemPath, itemName: sItemName,itemPos: sItemPos, ItemSelected: bItemSelected)

        }

    DownloadAction.backgroundColor = UIColor.purpleColor()
    return [DownloadAction]
}
5 Answers
Related