2012-10-07 12 views
14

私が発見したことNSBundleでNSNibLoading方法:償却されたNSNibLoadingメソッド(loadNibFile :, loadNibNamed :,など)の代替品ですか?

+[NSBundle loadNibFile:externalNameTable:withZone:] 
+[NSBundle loadNibNamed:owner:] 
-[NSBundle loadNibFile:externalNameTable:withZone:] 

は全て10.8で非推奨とマークされています - 後で10.8とでニブをロードする適切な方法は何ですか?

私のアプリでカスタムシートを作成しようとしていますが、NSWindowControllerをカスタムシート用にinitWithWindowNibNameで作成する必要がありますか?

+0

カスタムシート部分を別の質問に分割することを検討してください。カスタムシートを実装する最適な方法は何ですか。良いタイトルになるでしょう。 – alfwatt

答えて

6

NSBundleクラスメソッドloadNibNamed:owner:
loadNibNamed:owner:topLevelObjects:、OS X v10.8のに廃止されないとコメントin the documentation状態理由:従来の方法とは異なり

、オブジェクトは、標準的なココアに準拠メモリ管理ルール。ペン先の内容の割り当てが解除されるのを防ぐために、IBOutletを使用するか、配列への参照を保持することによって、それらを強力に参照する必要があります。

+0

あなたのケースでは、カスタムシートを作成していますが、シートに別のウィンドウコントローラを使用することをお勧めします。私の経験は、頭痛を避けることです。シートにコントロールを追加した場合 –

12

あなたのアプリがライオンをサポートするために起こっている場合は、loadNibNamed:owner:topLevelObjects:は発生しませんし、ライオンに実行するときには、例外(認識されないセレクター)を取得します。

// loadNibNamed:owner:topLevelObjects was introduced in 10.8 (Mountain Lion). 
    // In order to support Lion and Mountain Lion +, we need to see which OS we're 
    // on. We do this by testing to see if [NSBundle mainBundle] responds to 
    // loadNibNamed:owner:topLevelObjects: ... If so, the app is running on at least 
    // Mountain Lion... If not, then the app is running on Lion so we fall back to the 
    // the older loadNibNamed:owner: method. If your app does not support Lion, then 
    // you can go with strictly the newer one and not deal with the if/else conditional. 

    if ([[NSBundle mainBundle] respondsToSelector:@selector(loadNibNamed:owner:topLevelObjects:)]) { 
     // We're running on Mountain Lion or higher 
     [[NSBundle mainBundle] loadNibNamed:@"NibName" 
             owner:self 
          topLevelObjects:nil]; 
    } else { 
     // We're running on Lion 
     [NSBundle loadNibNamed:@"NibName" 
         owner:self]; 
    } 

あなたが本当にマウンテンライオン+のためtopLevelObjects:&arrayを使用したい、とあなたもライオンをサポートしたい場合は、それはあなたがloadNibFileにフォールバックする必要があります。次のようになります:いくつかの周り検索した後、私はこの思い付いたexternalNameTableを:withZone:(これはクラスとインスタンスの両方のメソッドとして利用できます)(これについては間違っている可能性があります)。これを置き換えるためにloadNibNamed:owner:topLevelObjects:が作成されたという印象を受けています。

シートの新しいloadNibNamed:owner:topLevelObjects:を使用すると、シート(ウィンドウ)の「リリース時に解放する」のチェックを外す必要がある点もあります。これは、シートを閉じたときの世話をする必要があります。

[self.sheet close]; 
self.sheet = nil; 

私はあなたが非モーダルウィンドウを開いている場合は、そのチェックボックスについて行われるべき正確に何か分かりません。何か案は?