2014-11-12 23 views
6

Ứng dụng của tôi có tùy chọn cho phép người dùng chọn giữa thanh tiêu đề/cửa sổ tiêu chuẩn "kích thước đầy đủ" và thanh tiêu đề/thanh công cụ "nhỏ gọn" có sẵn trong API NSWindow 10.10. Cụ thể, tôi đang sử dụng phương pháp -titleVisibility để đặt NSWindowTitleVisible hoặc NSWindowTitleHidden tùy thuộc vào tùy chọn của người dùng. Nếu người dùng chọn hộp kiểm "Thanh Tiêu đề Nhỏ gọn", NSWindowTitleHidden sẽ được áp dụng cho cửa sổ, nếu không, cửa sổ sẽ sử dụng kiểu mặc định. Khi giá trị hộp kiểm thay đổi, giá trị được lưu trữ trong giá trị mặc định của người dùng của ứng dụng và cửa sổ được cập nhật/vẽ lại.NSWindow with NSWindowTitleVisibilityKhông tiết kiệm khung không đúng cho cài đặt mặc định của người dùng?

Mọi thứ hoạt động tốt cho đến khi ứng dụng được khởi chạy lại. Mỗi khi ứng dụng khởi động, cửa sổ sẽ tăng lên chính xác số lượng không gian được lưu bằng cách chuyển từ kiểu cửa sổ mặc định (NSWindowTitleVisible) sang kiểu mới (NSWindowTitleHidden). Vì vậy, khởi động lại ứng dụng 5 - 6 lần sẽ làm cho cửa sổ tuôn ra với thanh thực đơn và thanh dock, tùy thuộc vào độ lớn của cửa sổ khi hộp kiểm được kiểm tra ban đầu.

Nói cách khác, có vẻ như khung cửa sổ đang được cập nhật trong NSUserDefaults khi thuộc tính được đặt. Có cách giải quyết nào cho vấn đề này không, hay tôi chỉ nhìn cái gì đó? Lời khuyên nào sẽ là muy hữu ích.

Cảm ơn!

+0

Đó là điên rồ mà họ đã không cố định mà được nêu ra, tôi đang gặp vấn đề tương tự, thiết lập '[self.window setTitleVisibility: NSWindowTitleHidden];' trong 'phương pháp awakeFromNib' điều khiển cửa sổ của tôi. Có lẽ chúng tôi đang làm sai điều gì đó… – Nightbirdsevolve

+0

Ứng dụng lịch OSX 10.10 có giao diện cụ thể và không có vấn đề. – Nightbirdsevolve

Trả lời

0

sửa chữa đơn giản cho bây giờ là lưu và khôi phục khung của cửa sổ bằng tay, dưới đây là cách tôi làm điều đó:

Trong đại biểu ứng dụng của bạn, khi ứng dụng chấm dứt, tiết kiệm khung của cửa sổ

- (void)applicationWillTerminate:(NSNotification *)notification 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect(self.windowController.window.frame) forKey:@"WindowFrameKey"]; 
} 

Trong phương thức -awakeFromNib của trình điều khiển cửa sổ của bạn, khôi phục khung

- (void)awakeFromNib 
{ 
    if([NSWindow instancesRespondToSelector:@selector(setTitleVisibility:)]) 
    { 
     // Hide Titlebar 
     [self.window setTitleVisibility:NSWindowTitleHidden]; 

     NSString *winFrameString = [[NSUserDefaults standardUserDefaults] stringForKey:@"WindowFrameKey"]; 

     if(winFrameString != nil) 
     { 
      NSRect savedRect = NSRectFromString(winFrameString); 

      if(!NSEqualRects(self.window.frame, savedRect)) 
      { 
       [self.window setFrame:savedRect display:YES animate:NO]; 
      } 
     } 
    } 
2

Thử đặt titleVisibility chống erty với số 1 trong User Defined Runtime Thuộc tính

enter image description here

1 là giá trị tương ứng cho NSWindowTitleHidden

typedef NS_ENUM(NSInteger, NSWindowTitleVisibility) { 
    /* The default mode has a normal window title and titlebar buttons. */ 
    NSWindowTitleVisible = 0, 
    /* The always hidden mode hides the title and moves the toolbar up into the area previously occupied by the title. */ 
    NSWindowTitleHidden = 1, 
} NS_ENUM_AVAILABLE_MAC(10_10); 

Tuy nhiên điều này sẽ in một thông báo ra cửa sổ Console phàn nàn rằng NSWindow là không tuân thủ mã hóa khóa giá trị cho tiêu đề chínhVisibility trên các phiên bản OS X trước đó đến 10.10

1

Một giải pháp tốt hơn (và khẳng định làm việc) đã được đăng tại https://openradar.appspot.com/18510665 bởi pointum:

Vấn đề là kích thước cửa sổ được phục hồi bởi hệ thống sử dụng -[NSWindow setFrameUsingName:] trước titleVisibility được thiết lập. Giải pháp:

  1. Xóa giá trị "Tự động lưu tên" trong Trình tạo giao diện.
  2. Đặt mã ngay sau khi đặt titleVisibility bằng cách sử dụng -[NSWindow setFrameAutosaveName:].
Các vấn đề liên quan