迫切需要 Xamarin.IOS 模态 MessageBox 之类的弹出窗口
Posted
技术标签:
【中文标题】迫切需要 Xamarin.IOS 模态 MessageBox 之类的弹出窗口【英文标题】:Desperately need Xamarin.IOS modal MessageBox like popup 【发布时间】:2019-01-12 20:08:18 【问题描述】:在 Xamarin ios 中编码。我有一个下拉列表类型弹出窗口,如果最终用户输入一个新值,我想问一个是/否问题:你想添加一个新行吗?
控件位于 UIStackView 中,该 UIStackView 位于容器 UIView 中,而 UIView 又位于另一个通过 segue 呈现的容器中。 Xamarin 需要我实现的 UIPopoverController。这是我到目前为止的代码:
using System.Threading.Tasks;
using Foundation;
using UIKit;
namespace PTPED_Engine
public enum MessagePopupType
YesNo = 1,
OKCancel = 2,
OKOnly = 3
public enum PopupResultType
OK = 1,
Cancel = 2,
Yes = 3,
No = 4
public static class AlertPopups
static NSObject nsObject;
public static void Initialize(NSObject nsObject)
AlertPopups.nsObject = nsObject;
public static Task<PopupResultType> AskUser(UIViewController parent, UIView V, string strTitle, string strMsg, MessagePopupType mpt)
using (UIPopoverController pc = new UIPopoverController(parent))
// pc.ContentViewController
// method to show an OK/Cancel dialog box and return true for OK, or false for cancel
var taskCompletionSource = new TaskCompletionSource<PopupResultType>();
var alert = UIAlertController.Create(strTitle, strMsg, UIAlertControllerStyle.ActionSheet);
// set up button event handlers
if (mpt == MessagePopupType.OKCancel)
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.OK)));
alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.Cancel)));
if (mpt == MessagePopupType.YesNo)
alert.AddAction(UIAlertAction.Create("Yes", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.Yes)));
alert.AddAction(UIAlertAction.Create("No", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.No)));
if (mpt == MessagePopupType.OKOnly)
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.OK)));
// show it
nsObject.InvokeOnMainThread(() =>
pc.PresentFromRect(V.Bounds, V, UIPopoverArrowDirection.Any, true);
);
return taskCompletionSource.Task;
我按如下方式调用它:
LookupCombo.Completed += async (object sender, CompletedEventArgs e) =>
C1AutoComplete AC = (C1AutoComplete)sender;
if (AC.Text.Trim() != "")
string sColName = AC.AccessibilityIdentifier.Trim();
var ValuesVC = (List<Lookupcombo_Entry>)AC.ItemsSource;
var IsThisAHit = from Lookupcombo_Entry in ValuesVC
where Lookupcombo_Entry.sDispVal.ToUpper().Trim() == e.value.ToUpper().Trim()
select Lookupcombo_Entry.sMapVal;
if (!IsThisAHit.Any())
string sTitle = "";
string sFull = _RM.GetString(sColName);
if (sFull == null) sFull = "???-" + sColName.Trim();
sTitle = " Add New " + sFull.Trim() + "?";
string sPPrompt = "Do you want to add a new " + sFull.Trim() + " named " + AC.Text.Trim() + " to the Database?";
var popupResult = await AlertPopups.AskUser(CurrentViewController(), V, sTitle, sPPrompt, MessagePopupType.YesNo);
;
CurrentViewController 是这样定义的:
private UIViewController CurrentViewController()
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
vc = vc.PresentedViewController;
return vc;
这没有任何作用。它挂起用户界面。
这应该是内置的,但它只内置在 Xamarin.Forms 中,我不想使用。
我用 await 做这些事情没有问题,但这根本行不通。有人可以帮忙吗?
谢谢!
【问题讨论】:
我没有看到任何将您的警报链接到弹出框的内容 可以使用UserDialogs库github.com/aritchie/userdialogs 我在调用之前添加了这个:pc.ContentViewController = alert;没有效果。 这是一个非常聪明的方法!我从未想过以这种方式使用 await 来进行模式对话框。也就是说,您说“根本不起作用”哪一部分不起作用? UI 永远不会出现,还是永远不会消失?几年前,我在 *** 中提供了一个丑陋的替代方案,它可以抽出事件队列,这不是一件好事,我更喜欢你的方法。 pnavk 请发表您的评论作为答案,以便我接受。 Acr 对话框优雅美观,第一次完美运行。谢谢!! 【参考方案1】:您可以只使用 ACR UserDialogs 库: https://github.com/aritchie/userdialogs
【讨论】:
【参考方案2】:这是我几年前提供的解决方案,与您的优雅方法相比,我认为这是一个丑陋的 hack。你没有说哪个部分不能完全工作,这可能有助于发现问题。
这是我几年前的解决方案:
iphone UIAlertView Modal
【讨论】:
以上是关于迫切需要 Xamarin.IOS 模态 MessageBox 之类的弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章
如果需要,多行 UIStackView / 换行 Xamarin.iOS
我是不是需要同时创建开发和生产 SSL 证书 Xamarin.iOS
Xamarin SQLite教程Xamarin.iOS项目添加引用
C# Xamarin IOS:相当于 C# IOS Xamarin 中的 SystemClock.ElapsedRealtime()