2017-09-13 5 views
0

J'ai le problème suivant dans ma déclaration dans iOS. J'ai besoin d'activer une commande au moment où l'utilisateur retourne à l'application quand il est en arrière-plan. Sur mon ContentPage je ne peux pas trouver une méthode pour identifier le retour. Dans Android, cela fonctionne correctement, que dans iOS, je ne peux trouver aucune fonction dans le contenu qui me montre que je rentraisappel méthode onresumo() dans une page de contenu XAMARIN FORMS

protected override void OnAppearing() 
    { 
     Debug.WriteLine("OnAppearing()"); 
     base.OnAppearing(); 
    } 

    protected override void OnDisappearing() 
    { 
     Debug.WriteLine("OnDisappearing"); 
     base.OnDisappearing(); 
    } 

    protected override void OnBindingContextChanged() 
    { 
     Debug.WriteLine("OnBindingContextChanged"); 
     base.OnBindingContextChanged(); 
    } 

J'ai essayé trois options mais aucun résultat

+0

Est-ce ce que vous cherchez peut-être? https://forums.xamarin.com/discussion/63577/app-onresume-not-called-on-ios – josemigallas

+0

Onresume est correctement appelé dans mon App.xaml.cs, pour travailler avec mon application, je devrais l'appeler onresume à l'intérieur d'une page de contenu –

+0

Oui, désolé, je n'ai pas réalisé que vous utilisiez XF. Suggestion stupide peut-être mais avez-vous essayé d'appeler la méthode de base en premier? : P – josemigallas

Répondre

2

je l'habitude de cette façon que je ne dois pas déranger avec des abonnements:

public partial class App : Application 
{ 
    public App() 
    { 
     InitializeComponent(); 

     MainPage = new MainPage(); 
    } 

    protected override async void OnStart() 
    { 
     if (Application.Current.MainPage is IAppStateAware appStateAwarePage) 
      await appStateAwarePage.OnStartApplicationAsync(); 
     if (Application.Current.MainPage.BindingContext is IAppStateAware appStateAwareVm) 
      await appStateAwareVm.OnStartApplicationAsync(); 
     // Handle when your app starts 
    } 

    protected override async void OnSleep() 
    { 
     if (Application.Current.MainPage is IAppStateAware appStateAwarePage) 
      await appStateAwarePage.OnSleepApplicationAsync(); 
     if (Application.Current.MainPage.BindingContext is IAppStateAware appStateAwareVm) 
      await appStateAwareVm.OnSleepApplicationAsync(); 
     // Handle when your app sleeps 
    } 

    protected override async void OnResume() 
    { 
     if (Application.Current.MainPage is IAppStateAware appStateAwarePage) 
      await appStateAwarePage.OnResumeApplicationAsync(); 
     if (Application.Current.MainPage.BindingContext is IAppStateAware appStateAwareVm) 
      await appStateAwareVm.OnResumeApplicationAsync(); 
     // Handle when your app resumes 
    } 
} 

public class YourContentPage : Page, IAppStateAware 
{ 
    public Task OnResumeApplicationAsync() 
    { 
     throw new System.NotImplementedException(); 
    } 

    public Task OnSleepApplicationAsync() 
    { 
     throw new System.NotImplementedException(); 
    } 

    public Task OnStartApplicationAsync() 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

public interface IAppStateAware 
{ 
    Task OnResumeApplicationAsync(); 
    Task OnSleepApplicationAsync(); 
    Task OnStartApplicationAsync(); 
} 
0

Comme dit josemigallas, vous recherchez App.OnResume(). Vous pouvez facilement vous abonner et vous désabonner à un événement MessagingCenter qui peut être envoyé à partir de votre méthode App.OnResume() pour déclencher des actions dans chacun de vos ContentPage s qui sont abonnées (ne pas oublier de vous désabonner de l'événement dans ContentPage.OnDisappearing() pour éviter les fuites de mémoire):

dans vos ContentPage s:

protected override void OnAppearing() { 
    Debug.WriteLine("OnAppearing()"); 
    base.OnAppearing(); 

    MessagingCenter.Subscribe<App>(this, "SpecialOnResumeKeyValue", app => { 
      //Do something 
    }; 
} 

protected override void OnDisappearing() { 
    Debug.WriteLine("OnDisappearing"); 
    base.OnDisappearing(); 

    MessagingCenter.Unsubscribe<App>(this, "SpecialOnResumeKeyValue"); //VERY IMPORTANT 
} 

Puis dans votre App.xaml.cs:

protected override async void OnResume() { 
    MessagingCenter.Send(this, "SpecialOnResumeKeyValue"); 
}