警告:视图不在 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");
我正在做一个 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");