2017-10-11 7 views
0

온라인 튜토리얼과 Apple docs를 읽었지만 Cocoa 앱을 작성하는 데 새로운 사람 (임베디드 C/C++ 펌웨어 & 네트워킹 코드) 코코아 바인딩의이 어두운 예술은 나에게 이해가 가지 않습니다.문서 기반 Swift 앱의 Cocoa 바인딩에 대한 겉으로보기에 어두운 배경

1) Xcode에서 MacOS Cocoa 응용 프로그램을 기반으로 문서를 만들었습니다.

2) 그 안에는 DocumentData이라는 하위 클래스 인 NSObject이 생성되었습니다.

3) DocumentData은 "foo"및 "bar"이고 두 개의 "동적"속성은 모두 Strings입니다.

4) NSDocument의 My Document 하위 클래스에는 docData이라는 DocumentData 속성이 있습니다. 내 Document 클래스의 makeWindowControllers() 방법에서

5), 나는 self.addWindowController(windowController) 후, 다음을 추가하여 docData 속성을가되도록 viewController의 표현 객체를 설정합니다

if let viewController = windowController.contentViewController as! ViewController? { viewController.representedObject = self.docData }

6)보기에서 Controller Scene View Controller View에 두 개의 NSTextFields을 추가하고 "Foo"와 "Bar"라고 각각 부릅니다.

7) 필자는 Assistant를 사용하여 View Controller swift code 창으로 끌어서보기 컨트롤러에 IBOutlets 두 개를 생성하여 각각 "foo"및 "bar"라고합니다.

8) 내 Document 클래스의 read() 방법에서, 나는 두 줄의 코드가 docData 개체의 두 가지 속성 세트에 추가 :이 시점에서

docData.foo = "foo" 
    docData.bar = "bar" 

을, 나는 코코아 바인딩을 얻을 수 있는지 생각 제대로 설정, 응용 프로그램의 "파일"메뉴에서 "열기"를 사용하여 내 응용 프로그램의 파일 확장명을 가진 문서를 열면 제목이 선택된 파일의 이름으로 설정되고 두 파일 NSTextField 창에있는 객체는 각각 "foo"및 "bar"라고 말합니다.

문제는 이러한 바인딩을 수행하는 방법에 대해 완전히 혼란 스럽습니다. 바인딩을 수행하는 방법이 다른 10 가지 예제를 보았지만 나에게 맞는 것은 없습니다.

NSArrayController을 View Controller에 추가해야합니까?

NSObjectController을 View Controller에 추가해야합니까?

정확히 XCode의 말도 안되는 UI에서 정확히 바인딩을 설정해야합니까?

이 작업은 매우 간단 할 것이라고 확신하지만, 이해가 가지 않습니다. Xcode IDE에 대한 경험이 많지 않은 온라인 자습서에 대한 도움말이나 포인터는 온라인에서 찾은 것보다 훨씬 좋습니다.

이 기사가 나에게 효과적 일 때 나는 어딘가에 github에 코드를 올려 놓고 Xcode의 사악한 IDE로 인해 다른 개발자가 이러한 바인딩과 관련하여 어려움을 겪을 수 있도록 도와 주겠다.

답변

0

1 ~ 6 단계 모두 양호합니다. 7 단계는 바인딩에 필요하지 않지만 어쨌든 앱에이 단계가 필요할 수 있습니다. 8 단계가 모두 좋다.

내가 누락 된 부분은 NSTextFields를 View Controller에 바인딩하는 것입니다.

NSObjectController 또는 NSArrayController을 사용하지 않고 직접 뷰 컨트롤러에 바인딩 할 수 있습니다.

오른쪽의 바인딩 속성 관리자 탭에서 Interface Builder에서 foobar 속성을 바인딩합니다.

Bind to이 선택되고보기 컨트롤러가 선택됩니다.

Controller Key은 비어 있으며, 사용자가 바인딩하려는 텍스트 필드에 따라 은 self.representedObject.foo 또는 self.representedObject.bar이됩니다.

사용 가능한 바인딩에 대한 자세한 내용은 NSTextField here의 바인딩 설명서를 참조하십시오.

올바른 바인딩의 "어둠의 예술"에 대한 자세한 내용은 예제 프로젝트에서 내 대답은 here에 링크를보십시오.

+0

어제 밤 (문자 적으로 XCode에서 제 2 일째) 시험해 보았습니다. 디버거 출력에 예외가 발생하여 뭔가 잘못하고있을 것임을 알았고 다른 방법을 찾고있는 웹에갔습니다. 바인딩을해라. 그것은 당신의 길을했고 & 예외를 다시 얻었다. 하지만 필자는 기본 문서 기반 응용 프로그램이 Apple이 시작한'ViewController' 템플릿에서'representingObject'를 재정의한다는 사실을 추적했습니다. 'override var representObject : Any? '에 대한 호출을 꺼 냈고 이제는 작동합니다! 도와 줘서 고마워. –

+0

다행입니다. –

+1

편집 가능한 경우'NSController'의 서브 클래스에'NSTextField'을 바인드하십시오. 그것은 더 잘 작동합니다. 'NSController'는'NSEditor'와'NSEditorRegistration' 비공식 프로토콜을 구현합니다. [NSControllers가 유용한 이유는 무엇입니까?] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/WhatAreBindings.html#//apple_ref/doc/uid/20002372-177085) – Willeke