2016-11-29 5 views
0

나는 NSWindowController 테이블을 보여 주며 다른 컨트롤러를 데이터 소스로 사용하고 NSTableView을 위임합니다. 이 두 번째 컨트롤러는 객체의 정보를 표시하며 NSWindowController에 의해 전달됩니다. 해당 컨트롤러는 AppDelegate에 의해 속성으로 설정된 개체를 갖습니다. 그것은 다음과 같습니다 다음 AppDelegate에서NSWindowController로 변경되지 않는 객체를 전달하는 올바른 방법은 무엇입니까?

class SomeWindowController: NSWindowController { 
    var relevantThing: Thing! 
    var someTableController: SomeTableController! 
    @IBOutlet weak var someTable: NSTableView! 

    override func windowDidLoad() { 
     someTableController = SomeTableController(thing: relevantThing) 
     someTable.dataSource = someTableController 
     someTable.delegate = someTableController 
    } 
} 

그때

func applicationDidFinishLaunching(_ aNotification: Notification) { 
    relevantThing = Thing() 
    someWindowController = SomeWindowController() 
    someWindowController.relevantThing = relevantThing 
    someWindowController.showWindow(nil) 
} 

같은이 합리적인 방법입니다합니까? 암시 적으로 랩핑되지 않은 선택자 인 SomeWindowController에서 사용 된 것 같은 나쁜 형태 일 수 있습니다. 또한, 내 경우에는 relevantThing을 변경할 수 없으므로 let이 더 정확할 것이라고 생각합니다. 어쩌면 relevantThing을 일정하게 만들고 이니셜 라이저를 통과시켜야할까요? 또는 init?(coder: NSCoder) 이니셜 라이저를 깰 수 있습니까?

Swift에서 올바른 작업을 수행 할 수있는 느낌을 얻으 려하므로 어떤 제안이라도 대단히 감사하겠습니다.

답변

0

몇 가지 :

은 당신의 코드에 윈도우 컨트롤러를 만들고 스토리 보드/XIB에서로드되지 않은 이유가 있나요?

일반적으로 더 좋은 방법은보기와 관련된 모든 '컨트롤러'를 NSViewController에두고 창 자체와 관련된 항목 (예 : 툴바, 창 관리 등)에만 NSWindowController을 사용하는 것입니다.

iOS와 마찬가지로 NSViewController이 이제 창 /보기 수명주기 및 응답자 체인에 통합되었습니다. 많은 창을 위해 NSWindowController을 서브 클래스화할 필요조차 없습니다.

XCode의 앱 프로젝트 템플릿은 창, 기본보기 및 해당 컨트롤러가있는 스토리 보드를 만듭니다. 이것은 좋은 출발점입니다.

NSWindowController은 속성이 주 콘텐츠보기의 NSViewController (스토리 보드에서로드 된 경우)로 설정되어 있습니다. 일반적으로보기 컨트롤러에 별도의보기 컨트롤러 속성이 필요하지 않습니다.

일반적으로 컨트롤러를 외부 코드에서 수정하는 것을 최소화하고 가능한 한 독립적으로 만들고 싶다고 생각합니다. 이것은 그것들을 더 시험하고 재사용 할 수있게 만든다.

당신의 Thing 인스턴스 (이 코드에서 나타나는), 당신은 Thing 클래스에 단독 인스턴스로 추가하고 NSViewController에서 검색 고려할 수 있습니다 전체 응용 프로그램에 대한 글로벌 경우 (예 : viewDidLoad())에

컨트롤러/뷰를 스토리 보드에 넣으면 테이블의 데이터 소스/위임을 연결할 수 있습니다. 그리고이 메인 윈도우라면, 앱이 시작될 때 자동으로로드되어 보여 질 수 있습니다. 그러나 어떤 경우 든,보기 컨트롤러에 NSViewController/View 배선을 넣으십시오.

메인 NSViewController 사이의 로직을 뷰의 특정 부분을 처리하는 좀 더 특수한 뷰 컨트롤러로 분리하려면 Interface Builder에서 NSContainerView을 사용하여 특정 뷰를 처리하기 위해 뷰 컨트롤러를 추가 할 수 있습니다.

+0

감사합니다. 스토리 보드를 확인해 주셔서 감사합니다. 앞으로 나아갈 길입니다. 고맙습니다! –