默认在 UISplitViewController 上显示 Master

Show Master on UISplitViewController by Default

当我为 Mac (v8.4.5) 创建一个带有 Visual Studio 的新 "Master Detail App" 时,UISplitViewController 的默认行为是显示 详细信息页面出现在纵向模式下的iPhone上时第一页。

我宁愿(我认为大多数人都愿意)默认显示 Master 页面。在我的例子中,母版页是一个 table 包含联系人列表的视图。

这个问题类似于:UISplitViewController in portrait on iPhone shows detail VC instead of master 但是 Xamarin.iOS

与那里建议的解决方案类似,我尝试分配委托但没有成功:

    public class ContactsSplitViewControllerDelegate : UISplitViewControllerDelegate
    {
        public override bool EventShowViewController(UISplitViewController splitViewController, UIViewController vc, NSObject sender)
        {
            return true;
        }

        public override bool EventShowDetailViewController(UISplitViewController splitViewController, UIViewController vc, NSObject sender)
        {
            return true;
        }
    }

    public partial class ContactsSplitViewController : UISplitViewController
    {
        public ContactsSplitViewController (IntPtr handle) : base (handle)
        {
            this.Delegate = new ContactsSplitViewControllerDelegate();
        }

    }

设置PreferredDisplayMode

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

    this.PreferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible;
}

经过一些试验,覆盖委托的 CollapseSecondViewController 似乎会起作用,但我还不确定这是正确的解决方案。

using Foundation;
using System;
using UIKit;

namespace MasterDetailTest
{
    public class SplitViewControllerDelegate : UISplitViewControllerDelegate
    {
        public override bool CollapseSecondViewController(UISplitViewController splitViewController, UIViewController secondaryViewController, UIViewController primaryViewController)
        {
            return true;
        }
    }

    public partial class MainPageSplitViewController : UISplitViewController
    {
        public MainPageSplitViewController (IntPtr handle) : base (handle)
        {
            this.Delegate = new SplitViewControllerDelegate();
        }

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

            // When implemented in my project, I found I needed to set this
            // or the delegate would not be called.
            this.SetNeedsFocusUpdate();
        }

    }
}