2016-10-26 2 views
1

내 응용 프로그램에서 전자 메일을 보내려고 할 때 Prism.Forms (v6.2.0)와 Xamarin Messaging Plugin (Xam.Plugins.Messaging v3.2.1) 사이의 충돌 문제를 해결하려고합니다.Xamarin.Forms (보기) 탐색 스택에 대해 프리즘을 재설정하는 방법은 무엇입니까?

다음 코드 - 내 ViewModels 중 하나에서 실행 :

using Plugin.Messaging; 

if (MessagingPlugin.EmailMessenger.CanSendEmail) 
{ 
    var email = new EmailMessageBuilder() 
     .To("[email protected]") 
     .Subject("Email subject here!") 
     .Body("Dear friend,\nI would like to say...\n\n\n") 
     .Build(); 
    MessagingPlugin.EmailMessenger.SendEmail(email); 
} 

이 오류를 생성 - 그리고 이메일 - 투 --전송되지 않을가 화면에 나타납니다 :

Warning: Attempt to present <MFMailComposeViewController: 0x108fb4400> on <Xamarin_Forms_Platform_iOS_PageRenderer: 0x107de67c0> whose view is not in the window hierarchy!

I 메시징 플러그인의 iOS 관련 부분에 표시 할 뷰가있는 UIViewController를 찾는 .GetVisibleViewController() 메서드가있어 전송할 전자 메일을 표시 할 수 있기 때문에 이러한 현상이 발생한다고 생각합니다. iOS가 좋아하지 않는보기 컨트롤러를 찾고 있습니다.

Prism.Forms를 사용하지 않는 MVVM 패턴의 Xamarin.Forms 앱에서 문제없이 실행되는 거의 동일한 코드가 있음을 지적하고 싶습니다. [편집 : Brian L. 이 문제는 아마 프리즘에 의한 것이 아니고 나는 그와 동의하는 경향이있다. 전자 메일 작성/전송 코드가 동일 함에도 불구하고 두 앱 사이의 "탐색 흐름"의 사소한 차이와 관련이있을 가능성이 큽니다. MessagingPlugin.EmailMessenger.SendEmail(email); 행이 실행되면 코드에 표시된 것처럼 수신자, 제목 및 본문과 함께 전자 메일이 화면에 표시됩니다. 보내기 또는 취소 버튼이 있습니다. 이 비 Prism Xamarin.Forms 응용 프로그램에서 잘 작동합니다.

그래서이 문제를 해결하기 위해 .SendEmail(email) 메서드 호출을 제대로 작동 시키려고했습니다. 내 X.F 페이지 (예 : 내 viewmodel의보기)를 iOS 전용 프로젝트 코드에 전달하여 .CreateViewController()을 호출해야합니다. 이 UIViewController있는 RootViewController UIWindow 만들고 해당 창을 .MakeKeyAndVisible(). Xam.Plugins.Messaging의 코드를 사용하여 UIViewController에 전달하도록합니다. .SendEmail(email) 메서드 호출이 발생하면 새로 작성한 UIWindow를 처리합니다. 이메일을 보내거나 취소 한 후에는 볼 수 없습니다.

이 모두가 작동하며 메시징 플러그인의 이메일 전송 기능을 예상대로 사용할 수 있습니다.

내 유일한 문제는 이메일을 보낸 후에 원래 ViewModel의 navigationService 인스턴스 (위 코드를 사용하여 이메일을 보내려고했던 ViewModel)로 탐색 호출이 실패한다는 것입니다. 내 view/viewmodel의 다른 기능은 이메일을 보낸 후에 잘 작동합니다. 하지만 navigationService.GoBackAsync() 또는 navigationService.NavigateAsync()에 실패하고 친숙한 오류가 발생 호출

Warning: Attempt to present <Xamarin_Forms_Platform_iOS_ModalWrapper: 0x1359c21a0> on <Xamarin_Forms_Platform_iOS_PlatformRenderer: 0x133df9640> whose view is not in the window hierarchy!

내가 생각을하는 나는하지 않고, Xamarin.Forms이 같은 (코드, 내 프리즘 NavigationService (보기) 스택을 재설정 수행 할 작업 프리즘) :

Navigation.InsertPageBefore(new HomePage(), Navigation.NavigationStack.First()); 
Navigation.PopToRootAsync(true); 

하지만 프리즘 NavigationService에 그런 "작업을 변경 탐색 스택을"할 수있는 방법이 표시되지 않습니다. 하지만 다른 사람이 그랬을까요?

답변

8

I have almost identical code (to that shown above) running without problems in an MVVM-patterned Xamarin.Forms app that does not use Prism.Forms

거의 동일한 미리

덕분 ..., 동일하지 않다. Prism은 MVVM과 관련하여 특별한 일을하지 않는다는 것을 말씀 드리고 싶습니다. 그것은 단순히 Page.BindingContext를 설정합니다. 그게 전부 야. 따라서 프리즘이없는 응용 프로그램에서 뷰와 VM만으로 작업하는 경우 프리즘 사용간에 차이가 없습니다.

질문에 대답하려면 탐색 스택을 재설정하려면 단순히 절대 URI를 사용하십시오. 그 노력할 것이 MainPage = new NavigationPage(new MainPage());

+0

에 해당 NavigateAsync("myapp:///NavigationPage/MainPage")

, 당신에게 브라이언 감사합니다! –

+0

다시 한번 감사드립니다, 브라이언. 그건 내 문제를 해결. 'navigationService.NavigateAsync ("HomePage")'를 호출하는 대신, 이제'navigationService.NavigateAsync ("app : /// HomePage")'를 호출하고 있습니다. - 모든 것이 제대로 작동하고 있습니다. Prism Absolute URI에 대한 문서를 찾았는데 위 예제에서 "myapp"가 "마법 문자열"이었는지 또는 내 응용 프로그램에 맞게 사용자 정의해야하는지는 분명하지 않았습니다. 그러나 그것은 "anystring : /// HomePage"일 수 있고 아직도 일하는 것처럼 보입니다. 그것이 틀린 지 알려주세요. 이 질문/응답의 미래 독자를 돕는 경우에 ... –

+1

그것은 정확합니다. 기본적으로 유효한 절대 URI를 제공하면됩니다. 'http : // www.myapp.com/MainPage'에서 실제'새 Uri ("uri", UriKind.Abslute)를 만드는 것까지 무엇이든 될 수 있습니다. –

관련 문제