Custom views/viewControllers , ellende

Custom NSView in Xcode 7.3 probleem

let list:AutoreleasingUnsafeMutablePointer<NSArray?> = nil
        let boolResult = NSBundle.mainBundle().loadNibNamed("SidebarView", owner: self, topLevelObjects: list)
        print(boolResult)
        print(list)

De outlets zijn strong and de File’s owner (SidebarViewController) is gekoppelt met de view.
Waar voorheen dit altijd correct werkte met Xcode lijkt nu bijna onmogelijk te zijn sinds die loadNibNamed is gewijzigd.

Een andere opzet die ik had geprobeerd is via de storyboard een viewController te maken en via instantiate op te vragen.
Dit gaat alleen goed wanneer de viewController gepresenteerd word.
Echter wanneer je het koppelt aan een subView en de OutlineView delegeert wanneer de numberOfRows groter dan 1 is
crashed de hele zooi (erg vreemd), hier is echter de IBOutlet van OutlineView gealloceerd en geintitialiseerd.

Kortom het werkt voor geen meter, iemand een idee van hoe en wat?

Kijk even in je ViewController info pane in je storyboard (ik zit niet achter een Mac dus weet niet precies hoe het heet) of er outlets zijn die niet verbonden zijn - die hebben dan een wit ipv zwart rondje. Misschien heb je recentlijk de naam van een outlet veranderd?

IBOutlets zijn gekoppeld.

Normaliter is de opzet:

  • NSView: hier plaats je de outlets
  • NSViewController: koppel je aan file’s owner en delegeer je aan de view
  • xib file: de view
NSBundle.mainBundle().loadNibNamed("SidebarView", owner: self, topLevelObjects: list)

Tot een bepaald niveau kan ik het werkend krijgen maar niet zoals gehoopt,
bovendien maakt het de code slordig wanneer het project groeit.
Ik ga maar eens een andere aanpak bedenken!

De foutmelding suggereert dat er iets mis is met de koppeling van je outlineView IBOutlet.

Apple heeft wat maffe wijzigingen doorgevoerd, wat vrij nadeling uitpakt met het laden van nib files.

Voorheen kon je bijvoorbeeld dit doen en heb je de view te pakken

 NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"myView" owner:self options:nil];
 NSView myView =   [array objectAtIndex:0];

Tegenwoordig kan dit niet meer, je krijgt hier een boolean waarde terug

NSBundle.mainBundle().loadNibNamed(<#T##nibName: String##String#>, owner: <#T##AnyObject?#>, topLevelObjects: <#T##AutoreleasingUnsafeMutablePointer<NSArray?>#>)

De array is to zover ik heb kunnen achterhalen gewoon leeg (meende iets van 0x0000000, iets van nil)

Maar zo zitten wel meer maffe fratsen in Xcode, wanneer je bijvoorbeeld de gekoppelde mainview controller aan NSWindows gaat vervangen voor een NSSplitViewController dat ineens de breedte van je applicatie 0 wordt en de minimale breedte instelling in Interface Builder compleet genegeerd wordt.
Deze bug zit er al veel langer in maar zeer slordig van Apple dat het niet fixen.

De loadNibNamed notatie heb ik inmiddels … (er is weer hoop)

    var objects: NSArray?;
    NSBundle.mainBundle().loadNibNamed("TestView", owner: self, topLevelObjects: &objects)
    view = objects?.firstObject as? TestView

Leuk hè, programmeren (y)