2016-03-30 11 views
1

私はSwiftには非常に新しく、プログラミングに関する知識はありますがSwiftコードでUdemyとLyndaのものを見てきましたが、私は遊び場からXcodeプロジェクトストーリーボードとスウィフト2.2 Mac Appカスタムセグはビューコントローラーを置き換えます

また、チュートリアルを見つけるのを少し難しくするMacアプリケーションを作成したいと思います。

最新のSwiftとStoryboardsも使用したいと思っています。私はそれを視覚的にレイアウトしたいと思います。そして、WWDCは、ストーリーボードが新しいMacアプリケーションのベストプラクティスであると示唆しています。

私は喜んでボタンを作成し、ビュー間でセグの移動を使用することができますが、ポップアップ、モーダルまたはシートは必要ありませんが、実際には(同じウィンドウ内にある)ビューを置き換える私はMacアプリケーションのためにこれをカバーする多くの単純な指導者がいないので、ストーリーボードを議論するときにiOSに移動します。誰が助けることができるならばそれは素晴らしいことだ、私は私の第二のViewControllerを作成していると私は、これはそれをサポートするコードであると信じて、私は属性

import Cocoa 

class CreateEditView: NSViewController { 

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

} 

で私の第二のViewControllerにこれを接続している再び例は、異なるように見えるが、 012(私はこのコードが実際に行っていることを説明することもできますが、これも素晴らしいでしょう)

答えて

1

私はObjective-Cでこのタイプのカスタムセグをしましたが、それは簡単ではありません。制約の権利が悪いAppleがビューコントローラに必ずしも自分のウィンドウが必要というわけではないと分かるまで、コンテナビューを使うことをお勧めします。

この例では、コンテナビューでViewControllerを設定し、ストーリーボードのFirstContainedビューコントローラにリンクしています。 「次へ」ボタンがあります。

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

私は、ストーリーボードにSecondContainedビューコントローラを作成し、それに識別子を与える「second_contained」。それは "戻る"ボタンを持っています。

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

ViewControllerトランジションのすべての作業を行います。 (制約を得ることは右、まだいくつかの努力を要することに注意してください。SecondContainedの見解で圧縮抵抗を減らすことによって開始します。)

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) 
    } 

} 

注これはスウィフト2.1であること。ロジックは移植可能でなければなりませんが、構文が変更されたかどうかはわかりません。

関連する問題