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

5

正如标题所说,我想从一个已存在于UIPopoverController中的UIViewController中显示另一个UIViewController。 我尝试了以下方法:

_secondViewController = new SecondViewController();
this.ModalPresentationStyle = UIModelPresentationStyle.CurrentContext;
this.ModelInPopover = true;
this.PresentModelViewController(_secondViewController, true);

然而,secondViewController 被显示在主视图控制器中,而不是弹出控制器中。
在这篇文章中,有人提到这是不可能的,并且违反了 HIG。然而,我在其他应用程序中也看到过这种情况(例如 Yahoo! 邮件),如果我没有记错的话。
我还在考虑另一种方法:如果我可以在弹出上下文中创建一个 UINavigationController,通过向 NavigationController 添加新的 ViewController,它可能会起作用。但是如何实现呢?

据我所知,你不能这样做,而且你可能也不应该这样做。你可以通过从非弹出 VC 调用 present modal view controller 来模拟这样的情况,并使用像 PresentFromRect 这样的东西。 - Candide
1个回答

3

请记住UINavigationController是UIViewController的子类。

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

用法:

var _NavController = new NavController();

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

Popover.PresentFromRect(...);

导航控制器:


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);
    }
}

Anuj,非常感谢你的回答。实际上,我也是这么解决的。我本来要回来回答自己的问题,但看到你已经发布了答案。很高兴我们想到了相同的解决方案。事实上,您不需要派生一个新的UINavigationController。您只需创建一个新的UINavigationController并将第一个ViewController推入其中,然后再将其附加到PopoverController即可。 - newman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接