2016-12-13 1 views
0

J'inclus UIActivityIndicator dans mon UIViewController. Je dois importer un fichier depuis FTP.UIActivityIndicator ne fonctionne pas correctement Xamarin IOS

J'ai un bouton sur mon ViewController, en cliquant sur ce bouton, le téléchargement va commencer. Je mets un UIActivityIndicator (aiReceive) sur mon ViewController, qui apparaît à l'état arrêté sur mon contrôleur de vue, mais qui ne s'anime qu'une fois le téléchargement du fichier terminé. Je fais une application iPad sous Xamarin IOS.

J'ai ajouté la méthode Async, mais j'obtiens maintenant l'erreur ci-dessous. L'attend opérateur ne peut être utilisé lorsque son contenant l'expression lambda est marquée avec le modificateur async

public partial class FirstViewController : UIViewController 
{ 
    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     btnReceiveData.TouchUpInside += (object sender, EventArgs e) => 
     { 
      //BTProgressHUD.Show("Receiving Data..."); --> This Component is also not working, 
      aiReceive.StartAnimating(); 
      await GetFileAsync()); 

      BTProgressHUD.Dismiss(); 

     }; 

    } 

async Task GetFileAsync() 
     { 
    using (var client = new HttpClient()) 
      { 
       try 
       { 
        aiReceive.StartAnimating(); /* --> Inimation is not starting at this point. Animation Start After Downloading file, download takes time, i want to show animation in the mean while.*/ 
         using (WebClient ftpclient = new WebClient()) 
         { 
          try 
          { 
           ftpclient.Credentials = new System.Net.NetworkCredential("UserName", "Password"); 
           string sourceFilePath = @"ftp://ftp.google.com/FileName.pdf"; 

             var FileDownloadStart = UIAlertController.Create("Info", "Data file received.", UIAlertControllerStyle.Alert); 
          FileDownloadStart.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, null)); 
             UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(FileDownloadStart, true, null); 

             //Downloading file from FTP. 
             ftpclient.DownloadFile(sourceFilePath, "C:\"); 

             var FileDownloadAlert = UIAlertController.Create("Info", "Data file received.", UIAlertControllerStyle.Alert); 
             FileDownloadAlert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, null)); 
             UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(FileDownloadAlert, true, null); 
          } 
          catch (Exception ex) 
          { 
           File.Delete(EpazzDirectory + AuditorId.ToString()); 
           var ExceptionAlert = UIAlertController.Create("Exception", ex.Message, UIAlertControllerStyle.Alert); 

           ExceptionAlert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, null)); 
           UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(ExceptionAlert, true, null); 
          } 

         } 
       } 
      } 
      } 

} 

Indicator is shown on the page all the time.

Répondre

1

Vous bloquez le fil de l'interface utilisateur, et qui empêche les modifications souhaitées faire à l'interface utilisateur de prendre effet (dans ce cas UIActivityIndicator animation tournante).

La meilleure façon de le faire est d'utiliser async/attendent comme:

aiReceive.StartAnimating(); 

await YourFTPRequestAsync(); 

aiReceive.StopAnimating(); 

Voici official MSDN documentation sur async \ attendent et un sample driven hint sur la façon dont cela fonctionne

+0

Je mis à jour mon code selon vos suggestions, mais obtenir une erreur. "L'opérateur await ne peut être utilisé que si son expression lambda contient le modificateur async" – Khaksar

+0

Oui, comme indiqué dans le document officiel, le mot-clé 'await' ne peut être utilisé que dans une méthode marquée avec le modificateur' async' 'public override async void ViewDidLoad()' – Nerkyator

+0

Désolé, je viens de réaliser que vous avez connecté votre demande à un lambda. Le placement 'async' correct doit être dans le lambda donc:' btnReceiveData.TouchUpInside + = async (expéditeur d'objet, EventArgs e) ' – Nerkyator