2016-10-07 2 views
0

저는 Xamarin.Forms 및 Xamarin.Auth를 사용하여 Facebook으로 로그인하는 응용 프로그램을 구축하고 있습니다. 여기 Xamarin.Forms PopModalAsync가 작동하지 않습니다.

내가 뭘하는지입니다 :

App.cs :

public App() 
{ 
    if (IsAuthenticated) 
    { 
     MainPage = new NavigationPage(new DetailPage()); 
    } 
    else { 
     MainPage = new NavigationPage(new WelcomePage()); 
    } 
} 

public Action SuccessfulLoginAction 
{ 
    get 
    { 
     return new Action(() => MainPage.Navigation.PopModalAsync()); 
    } 
} 

WelcomePage :

using System; 
using System.Threading.Tasks; 
using Xamarin.Forms; 

namespace Project 
{ 
    public class WelcomePage : ContentPage 
    { 
     public WelcomePage() 
     { 
      var login = new Button { Text = "Login" }; 
      login.Clicked += async (sender, e) => 
      { 
       await Navigation.PushModalAsync(new LoginPage()); 
      }; 

      Content = new StackLayout 
      { 
       BackgroundColor = Color.FromHex("F0C640"), 
       Padding = new Thickness(10, 40, 10, 10), 
       Children = { 
        new Label { Text = "Welcome", FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), HorizontalTextAlignment = TextAlignment.Center, TextColor = Color.White }, 
        new Label { Text = "Please login", FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), HorizontalTextAlignment = TextAlignment.Center, TextColor = Color.White }, 
        login 
       } 
      }; 
     } 
    } 
} 

LoginPage :

using Xamarin.Forms; 
using System.Threading.Tasks; 

namespace Project 
{ 
    public class LoginPage : ContentPage 
    { 
    } 
} 

LoginRenderer :

using System; 
using Xamarin.Auth; 
using Xamarin.Forms.Platform.iOS; 
using Xamarin.Forms; 
using Project; 
using Project.iOS; 

[assembly: ExportRenderer(typeof(LoginPage), typeof(LoginPageRenderer))] 

namespace Project.iOS 
{ 
    public class LoginPageRenderer : PageRenderer 
    { 
     bool IsShown; 

     public override void ViewDidAppear(bool animated) 
     { 
      base.ViewDidAppear(animated); 

      // Fixed the issue that on iOS 8, the modal wouldn't be popped. 
      // url : http://stackoverflow.com/questions/24105390/how-to-login-to-facebook-in-xamarin-forms 
      if (!IsShown) 
      { 
       IsShown = true; 

       var auth = new OAuth2Authenticator(
        clientId: App.Instance.OAuthSettings.ClientId, // your OAuth2 client id 
        scope: App.Instance.OAuthSettings.Scope, // The scopes for the particular API you're accessing. The format for this will vary by API. 
        authorizeUrl: new Uri(App.Instance.OAuthSettings.AuthorizeUrl), // the auth URL for the service 
        redirectUrl: new Uri(App.Instance.OAuthSettings.RedirectUrl)); // the redirect URL for the service 

       auth.Completed += (sender, eventArgs) => 
       { 
        // We presented the UI, so it's up to us to dimiss it on iOS. 
        DismissViewController (true, null); 

        if (eventArgs.IsAuthenticated) 
        { 
         Console.WriteLine("Authenticated!!!!"); 
         App.Instance.SaveToken(eventArgs.Account.Properties["access_token"]); 
         App.Instance.SuccessfulLoginAction.Invoke(); 
        } 
        else { 
         Console.WriteLine("Not authenticated!!!!"); 
         App.Instance.CanceledLoginAction.Invoke(); 
        } 
       }; 
       PresentViewController(auth.GetUI(), true, null); 
      } 

     } 
    } 
} 

모든 것이 잘 작동하며, Facebook 콘텐츠 및 로그인으로 모달 페이지를 표시 할 수 있습니다. 인증이 완료되면 auth.Completed 이벤트를 통해 App.Instance.SuccessfulLoginAction.Invoke();를 호출합니다. 그러나 App.cs의 MainPage.Navigation.PopModalAsync()는 모달 페이지를 닫지 않습니다.

모달 페이지가 시작 페이지에서 열리고 App.cs 파일에서 닫으려고합니다. 동일한 객체를 참조하지 않아서 여기에서 닫을 수 없습니까? 플랫폼 별 렌더러를 만들 때 모달 페이지를 닫으려면 어떻게해야합니까?

이 모달 페이지를 닫으려면 어떻게해야합니까? App.cs 이후

public void HandleLoginSucceeded(object sender, EventArgs e) 
    { 
     MainPage = new WelcomePage(); 
    } 

이 진입 점입니다 난 그냥 새를 가리 키도록 MainPage를 재설정 : I 인증을 위해 내 샘플에서 인증을 처리하는 방법을

감사

답변

0

은 아주 우아하지 않지만, 여기에 위치. 나는 이로 인해 발생할 수있는 상충 관계에 대해 알지 못한다. 그러나, 나는 그것이 작동한다는 것을 알고 있습니다. 내 구현을 보려면 Github에 내 샘플을 볼 수 있습니다.