几个UISplitViews的一个详细视图

时间:2016-05-02 20:06:40

标签: ios swift uisplitviewcontroller

我有3个UISplitViewController具有不同的主视图,但它们具有相同的详细视图。所有这些都在故事板中连接。

所有UISplitViewController都嵌套在UITabBarViewController中,因此我会通过标签栏项目在它们之间切换。

问题是,当我切换到另一个标签(另一个UISplitViewController)细节视图消失时,我只看到主视图,并且细节视图的位置用深灰色填充(见图)。切换后我不想重新加载细节视图,只需将其保留在屏幕右侧即可。

enter image description here

我不确定我需要提供哪些代码,所以如果您需要,请问,我会将其添加到问题中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

原因

我的第一个假设是,如果您在两个不同的UISplitViewController之间共享详细视图控制器,它们对应于UITabController的两个选项卡,则会创建两个单独的详细视图控制器。 使用此布局的测试项目确认了这一点:

enter image description here

Root View ControllerDetailViewController。当我在viewDidLoad(_:)内放置断点时,它会被击中两次并且打印显示创建了两个不同的DetailViewController实例:

(lldb) po self
<TestTabSplit.DetailTableViewController: 0x7fbd10eb9cd0>

(lldb) po self
<TestTabSplit.DetailTableViewController: 0x7fbd10ebc700>

解决方案

使用共享容器视图控制器作为两个UISplitViewController的详细视图控制器。

您的新故事板布局如下所示:

enter image description here

  1. 提供详细视图控制器(在本例中为导航控制器),故事板ID:
  2. enter image description here

    1. 接下来,在您的app委托中,实例化详细视图控制器:

      // Add a variable to reference from elsewhere.
      var sharedNavigationController: UINavigationController!
      
      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
          // Override point for customization after application launch.
      
          sharedNavigationController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SharedID") as! UINavigationController
          return true
      }
      
    2. 最后,容器视图控制器ContainerViewController只是UIViewController的子类,包含以下内容:

      override func viewDidAppear(animated: Bool) {
          super.viewDidAppear(animated)
      
          let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
          let sharedNavigationController = appDelegate.sharedNavigationController
      
          addChildViewController(sharedNavigationController)
          sharedNavigationController.view.frame = view.bounds
          view.addSubview(sharedNavigationController.view)
          sharedNavigationController.didMoveToParentViewController(self)
      }
      
    3. 通过此设置,您可以发现相同的详细视图控制器实例在选项卡之间共享,并且当您更改为新选项卡时,一个选项卡中的修改将保留。