2012-10-07 34 views
14

我發現,NSNibLoading方法在一個NSBundle:替代折舊的NSNibLoading方法(loadNibFile:,loadNibNamed:等)?

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

都標註爲廢棄在10.8 - 什麼是加載碎粒在10.8和以後的正確方法?

我試圖在我的應用程序中創建一個自定義工作表,我必須創建NSWindowControllerinitWithWindowNibName自定義工作表嗎?

+0

考慮將自定義工作表部分拆分爲它自己的單獨問題:實現自定義工作表的最佳方法是什麼?將是一個很好的標題。 – alfwatt

回答

6

NSBundle類方法loadNibNamed:owner:在OS X v10.8已被棄用,
loadNibNamed:owner:topLevelObjects:和評論in the documentation狀態原因:

不同於傳統方法,對象堅持標準可可內存管理規則;有必要通過使用IBOutlets或保存對數組的引用來保持對它們的強引用,以防止釋放nib內容。

+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; 

我不知道到底是什麼應該有關複選框,如果你打開一個非模態窗口中完成:當您關閉表這應該被照顧的。有任何想法嗎?