警告:视图不在 Window 层次结构中 Xamarin.Forms

Warning: View is not in Window Hierarchy in Xamarin.Forms

我正在做一个 Xamarin 项目,Forms,我已经集成 Xam.Plugins.Messaging 从我的应用程序发送 SMS。为此,我在我的 iOS 项目中使用以下代码创建了一个自定义渲染器:

AppDelegate smsObj = new AppDelegate();
bool a= smsObj.ShowAndSendSMS(new string[] { "123" }, "Hi there");

在我的 AppDelegate 中,我有如下代码:

public bool ShowAndSendSMS(string[] recipients, string body)
{
      UIViewController sms = new UIViewController();
      if (MFMessageComposeViewController.CanSendText)
      {
           MFMessageComposeViewController message = new MFMessageComposeViewController();
           message.Finished += (sender, e) => {
           message.DismissViewController(true, null);
      };
      message.Body = body;
      message.Recipients = recipients;
      sms.PresentModalViewController(message, false);
   }
   return true;
 }

我遇到的问题是在我第一次启动应用程序时,共享 SMS 的功能不起作用并且调试日志给我警告 "Attempt to present on whose view is not in the window hierarchy!"

但是,如果我重新启动该应用程序,相同的功能就像一个魅力。我犯错的地方有什么想法吗?

我认为问题在于您正在新建 AppDelegate 并从那里调用 ShowAndSendSMS。 iOS 将在应用程序启动时为您更新 AppDelegate,您应该始终使用它,而不是创建 AppDelegate 的新实例(至少我从未见过需要多AppDelegate-实例模式)。所以,试试这个:

像这样在您的项目中创建一个助手 class(我不太喜欢 "helper" 这个词,但这不是重点;为它命名适合您的项目):

using Foundation;
using UIKit;

public class SmsHelper
{
    public bool ShowAndSendSMS(string[] recipients, string body)
    {
        if (MFMessageComposeViewController.CanSendText)
        {
            UIViewController sms = new UIViewController();

            MFMessageComposeViewController message = new MFMessageComposeViewController();
            message.Finished += (sender, e) => {
                message.DismissViewController(true, null);
            };
            message.Body = body;
            message.Recipients = recipients;
            sms.PresentModalViewController(message, false);
        }
        return true;
    }  
}

然后更改您的页面渲染器以像这样使用它:

public class SMS_Ios: PageRenderer 
{
    private readonly TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

    protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    {
        base.OnElementChanged(e);

        SmsHelper smsObj = new SmsHelper();

        bool a = smsObj.ShowAndSendSMS(new string[] {"123"}, "Hi there");
    }
}

最后,从您的 AppDelegate.cs 中删除 ShowAndSendSMS,因为您以后将使用 SMS 助手。

让我知道这是否适合你。

如果您已经在 PCL 和您的平台上安装了 Xam.Plugins.Messaging 软件包。您可以在 PCL 中使用它的 API 来实现它,而无需在您的 iOS 平台中使用任何特殊代码。

您可以只在 PCL 中使用 Xam.Plugins.Messaging 的 API,如下所示:

// Send Sms
var smsMessenger = CrossMessaging.Current.SmsMessenger;
if (smsMessenger.CanSendSms)
   smsMessenger.SendSms("+27213894839493", "Well hello there from Xam.Messaging.Plugin");

参考:Messaging Plugin for Xamarin and Windows.