5

I have a NSSplitViewController in which first viewcontroller displays a table and second viewcontroller should display a viewcontroller from a list of viewcontrollers based on the selection of table row.

enter image description here

I'm using tableViewSelectionDidChange() to get the selected row.

Now I have a bunch of viewcontrollers(storyboard ID given as row number) that I should add and remove to second viewcontroller in NSSplitViewController

How can I do that?

unknownymouse
  • 399
  • 1
  • 5
  • 21

2 Answers2

9

You are on the right path. Within tableViewSelectionDidChange() you need to instantiate a new viewController from your storyboard using NSStoryboards instantiateController(withIdentifier: String) method. Then you can set this as your splitViews second view controller.

Then you need to create a splitViewItem. You can use the init method which takes a viewController for this (NSSplitViewItem(viewController:)).

Finally you have two possibilities to add the new viewController. Either you use the add/removeSplitViewItem methods or you set the splitViewItems array directly.

My words in code:

guard let splitViewController = self.parent as? NSSplitViewController,
      let viewController = self.storyboard?.instantiateController(withIdentifier: "yourIdentifier") as? NSViewController
        else { return }

let item = NSSplitViewItem(viewController: viewController)

// Method one
splitViewController.removeSplitViewItem(splitViewController.splitViewItems[1])
splitViewController.addSplitViewItem(item)

// OR method two
var items = splitViewController.splitViewItems
items[1] = item
splitViewController.splitViewItems = items
unknownymouse
  • 399
  • 1
  • 5
  • 21
mangerlahn
  • 4,746
  • 2
  • 26
  • 50
  • It works! But there's a small mistake in the method two. Change `parent` to `splitViewController`. – unknownymouse Mar 20 '17 at 06:49
  • This is great, thanks! One question: why not just add the new VC like so: `splitViewController.splitViewItems[1] = item`? – jeff-h Jun 09 '20 at 09:04
  • 1
    I'm not sure if it's an AppKit bug but if I assign the same item twice using `splitViewController.splitViewItems[1] = item` (eg if the user clicks the same table row twice) the split view disappears. Using "Method one" resolves this issue. – jeff-h Nov 22 '20 at 04:45
0

Objective C representation of the first method.

NSStoryboard * mainStoryboard = [NSStoryboard storyboardWithName:@"Main" bundle:nil];
NSViewController * sourceViewController = [mainStoryboard instantiateControllerWithIdentifier:identrifier];

NSSplitViewItem * item = [NSSplitViewItem splitViewItemWithViewController:sourceViewController];

[self removeSplitViewItem:[self.splitViewItems objectAtIndex:1]];
[self addSplitViewItem:item];
Jakab Robert
  • 739
  • 6
  • 7