2016-09-04 5 views
2

Interface Builderを使用せずにmacOSアプリケーションを作成しようとしています。私のプロジェクトはビルドされ、実行されますが、私のプライマリView Controllerはビューをロードしていないようです。つまり、viewDidLoad()メソッドは呼び出されません。私はXcode-beta 8.0 beta 6(8S201h)を使用しています。Swift 3でXIBを使用せずにNSViewControllerをプログラムで作成する

NSViewControllerためスウィフト3文書にこれはviewプロパティについてこう述べています。

あなたがそれにアクセスすると、このプロパティの値が設定されていない場合、ビューコントローラがloadView()メソッドを呼び出します。このメソッドは、View ControllerのnibNamenibBundleプロパティで識別されるnibファイルからビューを設定します。

ビューコントローラのビューを直接設定する場合は、ビューコントローラを作成した直後にこのプロパティの値を設定します。

そしてviewDidLoad用:

プログラムで作成されたビューコントローラの場合は、この方法はloadView()方法が完了した直後に呼び出されます。

最後に、isViewLoadedため:

ビューコントローラは、そのビューの遅延ロードを採用:ビューコントローラはメモリにロードされた直後に、そのisViewLoadedプロパティの値は、falseです。 loadView()メソッドが返された後で、システムがviewDidLoad()メソッドを呼び出す直前に、値はtrueに変わります。

したがって、ドキュメントによって、可能であると信じることができます。

. 
├── main.swift 
└── Classes 
    ├── AppDelegate.swift 
    └── Controllers 
     └── PrimaryController.swift 

main.swift

import Cocoa 

let delegate = AppDelegate() 
NSApplication.shared().delegate = delegate 
NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv) 

AppDelegate.swift

import Cocoa 

class AppDelegate: NSObject, NSApplicationDelegate { 
    func applicationDidFinishLaunching(_ aNotification: Notification) { 
     let pc = PrimaryController(nibName: nil, bundle: nil)! 
     print(pc.isViewLoaded) 
     pc.view = NSView() 
     print(pc.isViewLoaded) 
    } 
} 


私のプロジェクトでは、このようになります

PrimaryController.swift

import Cocoa 

class PrimaryController: NSViewController { 
    override func loadView() { 
     print("PrimaryController.loadView") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("PrimaryController.viewDidLoad") 
    } 
} 

ビル、上記収率で、このコンソール出力プロジェクトを実行している:

false 
true 

、コントローラのビュー負荷であるが、loadViewviewDidLoad方法決して呼び出されません。

私には何が欠けていますか?

答えて

2

ドキュメントをよく読んで啓発しています。具体的に:ときアクセスそれをこのプロパティの値は、すでに設定されていない場合

、ビューコントローラはloadView()メソッドを呼び出します。

試みがプロパティに値を持っている前viewプロパティを読み取るためになされたときの意味、loadView()にのみ呼び出されます。プロパティに直接値を代入すると、メソッド呼び出しをバイパスします。だから、

AppDelegate.applicationDidFinishLaunching(_:)はこのように書かれている場合:その後、loadViewビューをロードしようとするために、システムによって呼び出されます...

let pc = PrimaryController(nibName: nil, bundle: nil)! 
    print(pc.isViewLoaded) 
    let x = pc.view // accessing the view property before it has a value 
    print(pc.isViewLoaded) 

false 
PrimaryController.loadView 
false 

viewDidLoad()がまだないことをコントローラに自動的に関連付けられるビューはありません(つまり、ペン先はnilで、PrimaryController.xibは存在しません)。プロセスを完了するための正しい方法を手動PrimaryController.loadView()にビューをロードすることである。

print("PrimaryController.loadView") 
view = NSView() // instantiate and bind a view to the controller 

今プログラムは、所望の結果が得られる:コード(SWIFT 4.1)からのViewControllerを作る

false 
PrimaryController.loadView 
PrimaryController.viewDidLoad 
true 
0

最小限のセットアップを

class WelcomeViewController: NSViewController { 

    private lazy var contentView = MyCustomClassOrJustNSView() 

    override func loadView() { 
     view = contentView 
    } 

    init() { 
     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder: NSCoder) { 
     fatalError() 
    } 
} 
関連する問題