MonoTouch для IPad: как показать другой UIViewController в UIPopoverController? - PullRequest
5 голосов
/ 20 ноября 2011

Как сказал заголовок, я хочу показать еще один UIViewController из существующего UIViewController, который размещен в UIPopoverController. Я попробовал следующий метод:

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

Однако secondViewController отображается в контроллере основного вида, а не в поповерном контроллере.

В этом посте кто-то упоминает, что это невозможно, и это нарушает HIG. Однако я видел это в других приложениях (например, в Yahoo! Email), если не ошибаюсь.

Я также думаю о другом подходе: если бы я мог создать UINavigationController в контексте popover, он мог бы работать, просто добавив новый ViewController в NavigationController. Но как?

1 Ответ

3 голосов
/ 20 ноября 2011

Помните, что UINavigationController является производным от UIViewController.

Итак, вы можете использовать контроллер, содержащийся в UIPopover, как и любой другой контейнер ... в этом случае лучше использовать UINavigationController внутри UIPopover для отображения ViewControllers.

Использование:

var _NavController = new NavController();

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

Popover.PresentFromRect(...);

NavController:

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