警告:视图不在Xamarin.Forms的窗口层次结构中

时间:2017-10-22 17:44:51

标签: ios uiviewcontroller xamarin.ios xamarin.forms presentviewcontroller

我正在做一个Xamarin项目,Forms和我已经集成了Xam.Plugins.Messaging从我的应用程序发送短信。为此,我在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的功能不起作用,调试日志会给出警告,例如“尝试显示其视图不在窗口层次结构中!”< / p>

但是,如果我重新启动应用程序,相同的功能就像魅力一样。我犯错误的任何想法?

2 个答案:

答案 0 :(得分:0)

我认为问题在于你正在新建AppDelegate并从那里调用ShowAndSendSMS。在应用程序启动时iOS会为你推出新的AppDelegate,你应该总是使用它,而不是创建一个新的AppDelegate实例(至少我从未见过需要多AppDelegate实例模式的情况) )。所以,试试这个:

在你的项目中创建一个这样的辅助类(我不太喜欢“帮助器”这个词,但这不是重点;请将它命名为适合你项目的东西):

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,因为你将来会使用你的短信助手。

请告诉我这是否适合您。

答案 1 :(得分:0)

如果您已在PCL和平台中安装了Xam.Plugins.Messaging软件包。你可以在PCL中使用它来实现它,而不需要在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