【问题标题】:Change Detail View controller on Master View controller item click UISplitViewController更改主视图控制器项目上的详细视图控制器单击 UISplitViewController
【发布时间】:2017-10-14 01:12:23
【问题描述】:

我有一个 UISplitViewController,有一个主视图控制器,它是一个表和一个详细视图控制器。

我已经这样实现了:-

MainViewController.cs

    public override void ViewDidLoad()
    {
       UpdateView(masterVC,detailVC);
    }
    public void UpdateView(UIViewController master, UIViewController detail)
   {
       this.ViewControllers = new ViewControllers[]{master, detail};
   }

这很好用。现在我想在用户单击主视图控制器中的一行时将详细视图控制器更改为另一个。

我做的是:-

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
  {
             var mainVC = StoryBoard.InstantiateViewController("Main_VC") as MainViewController;
           mainVC.UpdateView(mainVC.ViewControllers[0], newDetailVc);
    }

这不会做任何事情,也不会将详细视图更改为新视图。我该如何实现?

【问题讨论】:

    标签: ios uiviewcontroller xamarin.ios uisplitviewcontroller detailview


    【解决方案1】:

    您重新实例化您的主视图控制器,而不是提供指向您在应用程序启动时加载的原始视图的指针,就应用程序而言,您只需更新“主”视图控制器的详细视图只停留在记忆中。

    当您在 MainViewController ViewDidAppear 方法中启动应用程序时,像这样创建一个对自身的静态引用:

    public static MainViewController MVCPointer {get; private set;}
    
    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);
    
        MVCPointer = (self as MainViewController).
    }
    

    然后在 rowselected 中您将执行以下操作:

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
           var mainVC = StoryBoard.InstantiateViewController("Main_VC") as MainViewController;
           mainVC.MVCPointer.UpdateView(mainVC.MVCPointer, newDetailVc);
    }
    

    有很多更整洁的方法可以做到这一点,以上只是调整当前代码的一种快速方法,我个人将对任何导航控制器的引用存储在 AppDelegate 内部的静态变量中,以便我可以在任何地方访问它,但仅此而已如果您的应用程序具有许多不同的视图控制器和导航控制器,则主要有用。

    做你想做的另一种方法是将你的 mainviewcontroller 的引用传递给你的 tableviewsource 类(如果你使用一个)

    这样你就可以简单地做:

    private static MainViewController MVCMain {get ; private set}
    
    public void nameofyourtableviewsource (object tableviewdata, MainViewController cont)
    {
          MVCMain = cont;
    }
    
    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
          (mainVC.ViewControllers[0] as MainViewController).UpdateView(mainVC, newDetailVc);
    }
    

    【讨论】:

    • 感谢您的回复。在您的第一个解决方案中,MVCPointer 是什么?
    • 对不起,完全掩盖了为它分配一个类,我刚刚修复了上面的代码 sn-p,现在应该有意义了。
    • 我尝试了第一种方法,但它的工作方式仍然与我的代码相同。细节控制器没有改变
    • 调试器确实将详细视图控制器显示为新控制器,但未显示在详细信息部分。这与我的方法类似
    • 你能给我一个例子/示例,我可以参考它实现相同的功能吗?
    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多