MonoTouch for IPad:如何在UIPopoverController中显示另一个UIViewController?

new*_*man 5 xamarin.ios ipad uipopovercontroller

正如标题所说,我想从现有的UIViewController中显示另一个UIViewController,它在UIPopoverController中托管.我尝试了以下方法:

_secondViewController = new SecondViewController();
this.ModalPresentationStyle = UIModelPresentationStyle.CurrentContext;
this.ModelInPopover = true;
this.PresentModelViewController(_secondViewController, true);
Run Code Online (Sandbox Code Playgroud)

但是,secondViewController显示在主视图控制器中,而不是弹出控制器.

在这篇文章中,有人提到它无法完成,它违反了HIG.但是,如果我没有弄错的话,我在其他应用程序(例如Yahoo! Email)中已经看到了这一点.

我还在考虑另一种方法:如果我可以在popover上下文中创建一个UINavigationController,它可能只需将新的ViewController添加到NavigationController即可.但是怎么样?

Anu*_*nuj 3

请记住,UINavigationController 派生自 UIViewController。

因此,您可以像任何其他容器一样使用 UIPopover 中包含的控制器...在这种情况下,最好在 UIPopover 中使用 UINavigationController 来显示 ViewController。

用法:

var _NavController = new NavController();

Popover = new UIPopoverController(_NavController);
Popover.PopoverContentSize = new SizeF(..., ...);

Popover.PresentFromRect(...);
Run Code Online (Sandbox Code Playgroud)

导航控制器:

public class NavController : UINavigationController
{
    UIViewController _FirstViewController; 
    UIViewController _SecondViewController;

    public NavController()
        : base()
    {
    }

    public override void LoadView()
    {
        base.LoadView();

        _FirstViewController = new UIViewController();

        // Initialize your originating View Controller here.
        // Only view related init goes here, do everything else in ViewDidLoad()
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        // When a button inside the first ViewController is clicked
        // The Second ViewController is shown in the stack.

        _FirstViewController.NavButton.TouchUpInside += delegate {
            PushSecondViewController(); 
        };

        this.PushViewController(_FirstViewController, true);
    }

    public void PushSecondViewController()
    {
        _SecondViewController = new UIViewController();
        this.PushViewController(_SecondViewController, true);
    }
}
Run Code Online (Sandbox Code Playgroud)