내 응용 프로그램에서 전자 메일을 보내려고 할 때 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에 그런 "작업을 변경 탐색 스택을"할 수있는 방법이 표시되지 않습니다. 하지만 다른 사람이 그랬을까요?
에 해당
NavigateAsync("myapp:///NavigationPage/MainPage")
, 당신에게 브라이언 감사합니다! –
다시 한번 감사드립니다, 브라이언. 그건 내 문제를 해결. 'navigationService.NavigateAsync ("HomePage")'를 호출하는 대신, 이제'navigationService.NavigateAsync ("app : /// HomePage")'를 호출하고 있습니다. - 모든 것이 제대로 작동하고 있습니다. Prism Absolute URI에 대한 문서를 찾았는데 위 예제에서 "myapp"가 "마법 문자열"이었는지 또는 내 응용 프로그램에 맞게 사용자 정의해야하는지는 분명하지 않았습니다. 그러나 그것은 "anystring : /// HomePage"일 수 있고 아직도 일하는 것처럼 보입니다. 그것이 틀린 지 알려주세요. 이 질문/응답의 미래 독자를 돕는 경우에 ... –
그것은 정확합니다. 기본적으로 유효한 절대 URI를 제공하면됩니다. 'http : // www.myapp.com/MainPage'에서 실제'새 Uri ("uri", UriKind.Abslute)를 만드는 것까지 무엇이든 될 수 있습니다. –