2016-03-30 11 views
1

Ich bin sehr neu zu Swift und obwohl einige Programmierkenntnisse und haben ein Udemy und Lynda Zeug auf Swift Code Ich habe ein wenig kämpfen, um vom Spielplatz zu einem bewegen Xcode-Projekt.Storyboards und Swift 2.2 Mac App benutzerdefinierte segue ersetzen Ansicht Controller

Ich möchte auch eine Mac-App erstellen, die das Finden von Lernprogrammen ein wenig schwieriger macht.

Ich möchte auch die neuesten Swift- und Storyboards verwenden, ich möchte sie visuell anordnen und WWDC schlägt vor, dass Storyboards die beste Vorgehensweise für neue Mac-Apps sind. Lister ist ein gutes Beispiel dafür.

Ich kann glücklich eine Schaltfläche erstellen und eine Zwischensequenz zwischen Ansichten verwenden, aber ich möchte nicht ein Popup, modal oder Blatt, sondern tatsächlich die Ansicht zu ersetzen (aka im selben Fenster bleiben), also nehme ich an ist eine benutzerdefinierte seque oder programmatic only Verbindung, wo ich stecken bleiben gibt es nicht viele einfache tutorials, die dies für Mac-Anwendungen abdecken, sie alle bewegen sich zu iOS bei der Diskussion Storyboards. Wenn jemand helfen kann, das wäre toll Ich habe meinen zweiten Viewcontroller erstellt und ich glaube, das ist der Kodex ist es zu unterstützen, habe ich verbunden, dies zu meinem zweiten Viewcontroller in Attributen

import Cocoa 

class CreateEditView: NSViewController { 

    required init?(coder: (NSCoder!)) { 
     super.init(coder:coder) 
    } 

} 

Auch hier ist die Beispiele, anders zu sein scheinen, aber möglicherweise nicht swift 2.2 (wenn jemand auch erklären kann, was dieser Code tatsächlich tut, würde das auch großartig sein)

Antwort

1

Ich habe eine benutzerdefinierte Strecke dieses Typs in Objective-C gemacht, aber es ist nicht einfach ... und bekommen Einschränkungen rechts ist schlechter. Bis Apple herausfindet, dass View-Controller nicht unbedingt ihre eigenen Fenster benötigen, empfehle ich eine Containeransicht.

In diesem Beispiel habe ich ViewController mit einer Containeransicht eingerichtet und einen FirstContained View-Controller damit im Storyboard verknüpft. Es hat einen "Weiter" -Button.

@IBAction func goToNext(sender: NSButton) { 
    NSNotificationCenter.defaultCenter().postNotificationName(ViewController.SecondController, object: nil) 
} 

ich einen SecondContained View-Controller im Storyboard und gebe ihm die Kennung "second_contained". Es hat einen "Zurück" -Knopf.

Die ViewController erledigt die ganze Arbeit für Übergänge. (Beachten Sie, dass Einschränkungen immer Recht noch einige Mühe. Beginnen Sie mit der Kompressionswiderstand in SecondContained ‚s Ansicht zu reduzieren.)

import Cocoa 

class ViewController: NSViewController { 

    static let FirstController = "FirstController" 
    static let SecondController = "SecondController" 

    @IBOutlet weak var container: NSView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "firstSelected:", name: ViewController.FirstController, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "secondSelected:", name: ViewController.SecondController, object: nil) 

     // This puts the "SecondContained" controller at location zero in the childViewControllers array. 
     let storyboard = NSStoryboard(name: "Main", bundle: nil) 
     let controller = storyboard.instantiateControllerWithIdentifier("second_contained") as? SecondContained 
     if let second = controller { 
      addChildViewController(second) 
     } 
    } 

    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func removePreviousView() { 
     if let oldView: NSView = container.subviews[0] { 
      oldView.removeFromSuperview() 
     } else { 
      print("No previous view found") 
     } 
    } 

    // This is a hack. 
    // It would be better to search for the controller by a reliable identifier rather than a number. 
    func useController(offset: Int) { 
     guard childViewControllers.count > offset else { 
      print("Bad offset \(offset) for \(childViewControllers.count)-long array") 
      return 
     } 
     if let controller: NSViewController = childViewControllers[offset] { 
      container.addSubview(controller.view) 
     } else { 
      print("No view controller!?") 
     } 
    } 

    func firstSelected(notification: NSNotification) { 
     removePreviousView() 
     useController(1) 
    } 

    func secondSelected(notification: NSNotification) { 
     removePreviousView() 
     useController(0) 
    } 

} 

Beachten Sie, dass diese 2.1 Swift ist. Die Logik sollte tragbar sein, aber ich weiß nicht, ob sich eine Syntax geändert hat.