2014-12-15 3 views
7

StoryBoards를 사용하여 표준 Xcode Swift 템플릿을 사용하여 새로운 OS X Cocoa 응용 프로그램을 만들었습니다.AppDelegate (Swift)에서 ViewController에 연결

사용자가 "파일"메뉴에서 "열기 ..."를 선택할 때 처리 할 AppDelegate.swift에서 IBAction을 구현했습니다. 선택된 파일이 유효한 이미지 파일이면 ViewController 뷰에 표시 할 NSImage를 만듭니다.

@IBAction func openFile(sender: NSMenuItem) { 
    var openPanel = NSOpenPanel() 
    openPanel.beginWithCompletionHandler { (result :Int) -> Void in 
     if result == NSFileHandlingPanelOKButton { 
      if let imageURL = openPanel.URL { 
       let image = NSImage(contentsOfURL: imageURL) 
       // PRESENT image IN THE VIEW CONTROLLER 
      } 
     } 
    } 

그러나 AppDelegate에서 ViewController에 연결할 방법이 없습니다. 나는 self.window를보아야한다는 제안을 발견 할 수 있었다! AppDelegate에는 있지만 AppDelegate에는 창과 같은 것이 없습니다.

감사합니다, 마이클 크 누드 센

답변

11

AppDelegate에이 스토리 보드에만 적용 장면 내에서 객체에 연결할 수 있는지 보인다. ViewController를 얻으려면 스토리 보드에서 인스턴스화하십시오.

샘플 :

@IBAction func menuAction(sender: AnyObject) { 
    if let storyboard = NSStoryboard(name: "Main", bundle: nil) { 
     let controller = storyboard.instantiateControllerWithIdentifier("VC1") as NSViewController 

     if let window = NSApplication.sharedApplication().mainWindow { 
      window.contentViewController = controller // just swap 
     } 
    } 
} 
+0

감사합니다. 내가 필요한 것! –

+0

인스턴스가 생기면 어떻게 사용합니까? 그냥 함수를 호출했는데 작동하지 않습니다 (또는 오히려 메서드 선언에 정의되지 않은 인수가 필요합니다). 이 분리에 대한 이유가 있다고 가정하지만 응용 프로그램 메뉴의 AppDelegate (및 메뉴의 UI 일부만) 호출 할 수 있기 때문에 나는 왜 이런 식으로 이해하지 않습니다.내 메뉴 항목이 내보기를 업데이트하도록하는 쉬운 방법 및/또는 올바른 방법이 있습니까? – Subcreation

+1

첫 번째 응답자는 어떻게 사용하나요? 스토리 보드에서 @IBAction으로 정의하는 첫 번째 응답자의 작업에 메뉴 작업을 연결합니다. 하지만 NSViewController는 응답 체인에 없으므로 컨트롤러를 윈도우의 위임 (NSWindow는 응답 체인에 있음)으로 설정하십시오. – bluedome

1

나는 최근이 같은 일을하려고 붙어 내가 내의 ViewController에 @IBAction를 생성하고 제어 내 응용 프로그램의 첫 번째로 끌어 내보기를 업데이트하는 데 필요한 이벤트를 얻을 관리했다 Responder (내 스토리 보드보기의 메뉴 위). Application Menu Items Xcode

덕분 먼저 응답자의 행동에 연결하는 제안에 대한 Bluedome하기 :

다음은 숲에서 저를 얻었다 질문입니다.

0

메뉴에서 첫 번째 응답자 (메뉴 위의 빨간색 큐브)로 컨트롤을 드래그하고 기존 작업을 선택한 경우보기 컨트롤러에 "응답 체인"을 할 수 있습니다. 내 경우에는 내가 openFile에 열기를 부착 한 후 내보기 컨트롤러에서 나는 다음과 같은

override var acceptsFirstResponder: Bool { 
    return true 
} 

func openFile(sender: NSMenuItem) { 
    print("In view controller") 
} 

을 추가하며 AppDelegate에의 변경없이 일했다. 대부분의 메뉴는 이미 첫 번째 응답자에 연결되어 있으므로보기 컨트롤러에 일치하는 함수 이름을 추가하면됩니다.

자세한 내용은 Event Handling Basics에있는 comment과이 문서를 참조하십시오.

0

mainWinow 속성 및 contentViewController 속성에 액세스하여 사용자 정의 ViewController 클래스에 대한 참조를 만들 수 있습니다. 이것은 iOS rootViewController 속성과 유사합니다.

let rootViewController = NSApplication.shared().mainWindow?.windowController?.contentViewController as! ViewController 

이제이 참조를 사용하여 AppDelegate의 기본 스토리 보드에있는 IBOutlets에 액세스 할 수 있습니다.

rootViewController.myTextView.textStorage?.mutableString.setString("Cats and dogs.") 

하나의 Window에 하나의 ViewController가있는 간단한 앱에 유용합니다.

+0

실례지만 NSApplication.shared()를 사용하여 AppDelegate에서 루트보기 컨트롤러에 대한 참조에 액세스하고 있습니까? 그건 맞지 않아. –

관련 문제