2016-10-26 9 views
0

Xib에서 NSView를 올바르게로드하는 방법은 무엇입니까?Swift 3로 Xib에서 NSView를로드하는 방법

내 코드 :

var topLevelArray: NSArray? = nil 
let outputValue = AutoreleasingUnsafeMutablePointer<NSArray>(&topLevelArray) 

if Bundle.main.loadNibNamed("RadioPlayerView", owner: nil, topLevelObjects: outputValue) { 
    let views = outputValue.pointee 
    return views.firstObject as! RadioPlayerView 
} 

topLevelArray = nil 
return nil 

문제는 최대한 빨리 함수, 내가 프로토콜을 만들어

+0

클래스 속성을 사용하여 강한 참조를 유지하고 출시되지 않습니다. ARC 및 메모리 관리에 대해 더 잘 이해하려고 노력하십시오. – Volker

+0

네, 맞습니다. 하지만 나는 강력한 참조를 유지하고 싶지 않다.보기를로드하고 완료하려고한다. 사실, 문제를 해결했습니다. 그것은 아주 간단합니다, 그냥 포인터 변수를 제거합니다 할 outputValue = AutoreleasingUnsafeMutablePointer (topLevelArray) 그냥 Bundle.main.loadNibNamed ("RadioPlayerView"소유자 : 전무, topLevelObjects : & topLevelArray) –

답변

1

ACCESS_BAD_ADDRESS와 프로그램 충돌에서 반환으로 "outputValue"인 자동 해제 포인터이며, 및 확장이 작업을 수행합니다 :

import Cocoa 

protocol NibLoadable { 
    static var nibName: String? { get } 
    static func createFromNib(in bundle: Bundle) -> Self? 
} 

extension NibLoadable where Self: NSView { 

    static var nibName: String? { 
     return String(describing: Self.self) 
    } 

    static func createFromNib(in bundle: Bundle = Bundle.main) -> Self? { 
     guard let nibName = nibName else { return nil } 
     var topLevelArray: NSArray? = nil 
     bundle.loadNibNamed(NSNib.Name(nibName), owner: self, topLevelObjects: &topLevelArray) 
     guard let results = topLevelArray else { return nil } 
     let views = Array<Any>(results).filter { $0 is Self } 
     return views.last as? Self 
    } 
} 

사용법 :

final class MyView: NSView, NibLoadable { 
    // ... 
} 

// ... 다른 곳에서 :

let myView: MyView? = MyView.createFromNib()