MonoTouch for iPad:如何显示弹出对话框?

时间:2011-10-29 15:39:47

标签: ipad xamarin.ios uialertview uiactionsheet

我刚开始学习使用MonoTouch为iPad开发应用程序(主要是)。也许是因为我在C#世界的多年经验,它使我的转换非常困难,有时我觉得很愚蠢。在C#中这是非常简单的事情,但这让我抓狂了......

弹出对话框?

对于iPhone,你很少有这个要求,因为无论你展示什么都会占据整个屏幕,所以你只需为每个弹出窗口创建一个控制器。

对于iPad,我有更多空间,我不希望整个屏幕占用一些控件(例如登录屏幕)。这就是我想把它作为弹出窗口显示的原因。我在其他iPad应用程序中看到了这一点。

根据我的学习,我需要使用UIAlertView或UIActionSheet来完成这项工作。但我不明白的是,正如我读过的所有例子所示,你必须从代码中创建所有控件。

我想要做的是使用IB创建UI,并将其插入UIActionSheet。可能吗?我该怎么做?

3 个答案:

答案 0 :(得分:6)

如果这是仅限iPad的应用程序,您将需要使用UIPopoverController。这是一个包含视图的弹出“窗口”,它链接到屏幕上的某个区域,例如工具栏按钮或矩形(例如UIButton的框架)。

要使用它,请使用接受UIViewController的构造函数创建UIPopoverController的新实例,并传递要显示的视图。

由于垃圾收集注意事项,请确保将UIPopoverController存储在类级属性中。

当弹出窗口关闭时,您可能还想清理此属性。为了支持这一点,我们将UIPopoverController子类化,添加了一个可以被调用者钩住的事件,然后覆盖了Dismiss方法并在重写方法中触发了钩子事件(如果有的话)。

实例化弹出窗口后,您将需要显示它。您可以通过其中一种PresentFromxxx方法执行此操作。如果您通过按钮(而不是工具栏)呈现此内容,则可以使用按钮的框架作为矩形调用PresentFromRect。

显示的视图可以通过在ViewDidLoad方法中设置ContentSizeForViewInPopover属性来控制其大小。

答案 1 :(得分:1)

您无法从Interface Builder编辑UIActionSheet或UIAlertView。

你可以做的是在Interface Builder中创建一个视图,并在其他视图的顶部以模态方式显示它,但听起来你不想占据整个屏幕,这就是会发生的事情。以下是模态视图控制器的示例:http://pastebin.com/h221BQdK

我认为您应该按照您提到的示例进行操作,并从代码中创建UIAlertView,也许可以将其设置为静态实用程序类。我创建了一个更像窗口的MessageBox类,但你也可以在那里放置文本框进行登录。看一下应用程序商店的登录框,它就是一个很好的例子。

答案 2 :(得分:0)

创建一个名为extraviewcontroller的viewcontroller,将其高度宽度设置为300 * 215。 并写下面的代码

inviewdidload

pickerviewTitle = [[UIPickerView alloc] initWithFrame:CGRectMake(0,0, 383, 250)];
pickerviewTitle.delegate = self;
pickerviewTitle.tag = 0;
pickerviewTitle.showsSelectionIndicator = YES;

controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ExtraViewController"];
popovercontroller = [[UIPopoverController alloc] initWithContentViewController:controller];
popovercontroller.delegate = self;

然后

UIActionSheet *actionSheet1 = [[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:@"Done" destructiveButtonTitle:nil otherButtonTitles:nil];
actionSheet1.tag = 0;
actionSheet1.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet1 addSubview:pickerviewTitle];
[actionSheet1 setFrame:CGRectMake(0, 0, 600, 400)];

[controller.view addSubview:actionSheet1];


if ([popovercontroller isPopoverVisible]) {
    [popovercontroller dismissPopoverAnimated:YES];
} else {

    //the rectangle here is the frame of the object that presents the popover,
    //in this case, the UIButton…

    CGRect convertedFrame = yourclickbutton.frame;


    [popovercontroller presentPopoverFromRect:convertedFrame
                                       inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionRight
                                     animated:YES];

}