2017-01-09 7 views
0

xib 파일에서 뷰를 생성 한 다음 해당 아웃렛을 클래스에 연결하는 방법이 있는지 궁금해했습니다. 따라서 해당 클래스의 인스턴스를 여러 개 작성하여 창문. 몇 가지 문제가 있으므로 코드 수정을 도와 줄 수 있습니까?Nib에서 NSView의 다중 인스턴스로드하기

는 여기에 내가했던 일이야 : CustomView.xib 및 CustomView.swift :

는 첫째로 나는이 개 파일을 만들었습니다. 그런 다음 NSImageView를 사용자 정의보기에 추가하는 인터페이스를 설계했습니다. 파일의 소유자를 클래스 이름으로 설정하고 NSImageView의 콘센트를 클래스에 추가했습니다.
override init(frame: CGRect) { 
    super.init(frame: frame) 
    let view = loadView() 
    view.frame = bounds 
    addSubview(view) 
} 

required init?(coder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

그래서 내가 두 변수를 만드는 방법에 갔다 : 인터페이스를로드

func loadView() -> NSView { 
    var top = NSArray() 
    Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &top) 
    let view = top[0] as! NSView 
    return view 
} 

그리고 클래스를 설정 :

는 다음 나는 펜촉에서 인터페이스를로드하기 위해 다음과 같은 기능을 만들어 그 수업을 창문에 올려 놓으세요 :

var x = CustomView(frame: CGRect(x: 0, y: 0, width: 600, height: 105)) 
var y = CustomView(frame: CGRect(x: 0, y: 105, width: 600, height: 105)) 

그리고 어떤 이유로이 코드 g 이상한 오류가 있습니다. 하나의 변수로 처음으로 작동했지만, 둘 이상을 배치하면 NSView에서 NSWindow 유형을 변환 할 수 없다고 말합니다.

은 'NSView의'(0x7fffb5d04bb0)에 유형의 가치 'NSApplication'(0x7fffb5cf3ef0)를 캐스팅 할 수 없습니다.

enter image description here

은 가끔 최초의 최상위 개체가보기 때문에이 오류가 주어 있다고 생각하고, 때때로 창입니다. 그래서 나는 혼란스러워진다.

let view = top[0] as! NSView 

그래서 문제가 여기에 무엇 :

은 분명히 오류가이 라인에 발생합니다?

+0

를 얻기 위해 filter 기능을 사용하여 (코코아 터치 코드에 응답하지 마십시오)? –

+0

무슨 소리 야? 방금보기를 만들었습니다 : 파일> 새로 만들기> 파일>보기. – Cristian

+0

Xcode에서 인터페이스 파일을 만들라고 말하면 응용 프로그램,보기, 비어있는, 스토리 보드의 옵션을 제공합니다 ... 응용 프로그램 유형이 원하는 것이 아니라고 가정합니다. –

답변

1

당신이 당신의 .xib 파일, 당신이 XIB의 스타일을 선택 했을 만들 때 NSView 예를

func loadView() -> NSView { 
    var topLevelObjects = NSArray() 
    Bundle.main.loadNibNamed("CustomView", owner: self, topLevelObjects: &topLevelObjects) 
    let views = (topLevelObjects as Array).filter { $0 is NSView }   
    return views[0] as! NSView 
}