2012-10-07 12 views
14

Tôi đã phát hiện ra rằng các phương pháp NSNibLoading trong NSBundle:Thay thế cho các phương thức NSNibLoading bị mất giá (loadNibFile :, loadNibNamed :, v.v.)?

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

đều được đánh dấu bị phản đối ở 10,8 - cách thích hợp để tải các ngòi ở 10,8 và sau đó là gì?

Tôi đang cố gắng tạo trang tính tùy chỉnh trong ứng dụng của mình, tôi có phải tạo NSWindowController với initWithWindowNibName cho trang tính tùy chỉnh không?

+0

Cân nhắc chia phần trang tính tùy chỉnh thành câu hỏi riêng của riêng nó: Cách tốt nhất để triển khai bảng tùy chỉnh là gì? sẽ là một danh hiệu tốt. – alfwatt

Trả lời

6

Các NSBundle lớp phương pháp loadNibNamed:owner: bị phản đối trong OS X v10.8,
loadNibNamed:owner:topLevelObjects:không và các ý kiến ​​in the documentation nhà nước do tại sao:

Không giống như các phương pháp di sản, các đối tượng tuân thủ các tiêu chuẩn cacao quy tắc quản lý bộ nhớ; nó là cần thiết để giữ một tham chiếu mạnh mẽ với họ bằng cách sử dụng IBOutlets hoặc giữ một tham chiếu đến mảng để ngăn chặn các nội dung nib được deallocated.

+0

Mặc dù trong trường hợp của bạn, tạo một bảng tùy chỉnh, tôi khuyên bạn nên sử dụng một bộ điều khiển cửa sổ riêng biệt cho trang tính. Kinh nghiệm của tôi là bạn sẽ tránh được đau đầu, đặc biệt. nếu bạn thêm bất kỳ điều khiển nào vào trang tính. –

12

Nếu ứng dụng của bạn sẽ hỗ trợ Lion, thì loadNibNamed:owner:topLevelObjects: sẽ không kích hoạt và bạn sẽ nhận được ngoại lệ (bộ chọn không được nhận dạng) khi chạy trên Lion. Sau khi một số tìm kiếm xung quanh tôi đến với điều này:

// 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]; 
    } 

Nếu bạn thực sự muốn sử dụng topLevelObjects:&array cho Mountain Lion +, và bạn cũng muốn hỗ trợ Lion, có vẻ như bạn sẽ cần phải rơi trở lại trên loadNibFile: externalNameTable : withZone: (có sẵn như là cả một lớp và phương pháp dụ) cho điều kiện Lion (tôi có thể sai về điều này). Tôi nhận được ấn tượng rằng loadNibNamed:owner:topLevelObjects: đã được tạo để thay thế điều này.

Tôi cũng đã đọc ở nơi khác rằng khi sử dụng loadNibNamed:owner:topLevelObjects: mới hơn cho trang tính bạn nên bỏ chọn "Phát hành khi đóng" cho trang tính (cửa sổ). Điều này nên được giải quyết khi bạn đóng tờ:

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

Tôi không chắc chắn chính xác nên làm gì về hộp kiểm đó nếu bạn đang mở cửa sổ không theo phương thức. Bất kỳ ý tưởng?