2010-03-11 28 views
5

Trong mã của tôi dưới đây, CustomWindow là một phân lớp của NSWindow.Con trỏ đến NSWindow Xib sau khi tải nó?

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

Làm thế nào để bạn có được con trỏ để kiểm soát XIB sau khi tải nó để bạn có thể làm những việc như định tâm NSWindow (Tôi có nghĩa là serialized nằm bên trong XIB)?

Tôi đang làm gì sai ở đây?

Trả lời

16

Bạn nên sử dụng lớp con NSWindowController. NSWindowController được thiết kế đặc biệt để thực hiện chính xác những gì bạn muốn đạt được và giải quyết một số vấn đề mà bạn sẽ gặp phải nếu bạn tải nib trực tiếp bằng các phương pháp của NSBundle. Bạn thường phải sử dụng lớp con NSWindowController để quản lý cửa sổ.

Tạo một lớp con của NSWindowController:

@interface MyWindowController : NSWindowController {} 
@end 

@implementation MyWindowController 
- (id)init 
{ 
    self = [super initWithWindowNibName:@"MyWindow"]; 
    if(self) 
    { 
     //initialize stuff 
    } 
    return self; 
} 
//this is a simple override of -showWindow: to ensure the window is always centered 
-(IBAction)showWindow:(id)sender 
{ 
    [super showWindow:sender]; 
    [[self window] center]; 
} 
@end 

Trong Interface Builder, thiết lập các lớp của tập tin của chủ sở hữuMyWindowController và kết nối window ổ cắm của tập tin của chủ sở hữu đến đối tượng cửa sổ trong nib của bạn.

Sau đó bạn có thể hiển thị các cửa sổ bằng cách làm này:

MyWindowController* controller = [[MyWindowController alloc] init]; 
[controller showWindow:self]; 
+0

Tôi đã làm mọi thứ bạn đã nói, ngoại trừ "kết nối cửa sổ của Chủ sở hữu tệp". Một khi tôi đã làm tất cả mọi thứ đã làm việc. Cảm ơn nhiều! +1 và đánh dấu. –

+0

Đảm bảo bỏ chọn thuộc tính 'Restorable' của cửa sổ trong IB. –

+0

@KeithSmiley Trình chỉnh sửa nào là thuộc tính 'Restorable', hay nó không còn áp dụng cho Xcode 5.x? –

1

Có thể bạn không muốn đặt cửa sổ của mình là Chủ sở hữu tệp. Thông thường bạn sẽ vượt qua self hoặc một số đối tượng điều khiển ở đó. Sau đó, nếu self hoặc đối tượng bộ điều khiển đó có một CustomWindow IBOutlet, nó sẽ được kết nối khi bạn gọi loadNibNamed:. Hãy xem this post để biết mã ví dụ.

+0

CustomWindow là đối tượng điều khiển. Nó chứa IBOutlets được nối khi tôi chạy ứng dụng. Các điều khiển trên cửa sổ đều hoạt động. Chỉ cần không thể tìm ra cách căn giữa nó. –

0

XIB là một vùng chứa cho các đối tượng, nó không bằng một cửa sổ. Bạn không thể tập trung vào XIB, bạn chỉ có thể căn giữa một cửa sổ chứa trong XIB.

Ngoài ra, các đối tượng trong XIB được tạo khi bạn tải. Bạn không vượt qua một đối tượng như là chủ sở hữu mà sau đó đứng trong một trong các đối tượng trong XIB, bạn thay vì sử dụng IBOutlets để có được tham chiếu đến các đối tượng mới được tạo ra khi tải XIB và sau đó bạn có thể tương tác với chúng.

Đối tượng Chủ sở hữu tệp là đối tượng đặc biệt trong XIB, vì đó là đối tượng duy nhất không được tạo và bạn có thể chỉ định đối tượng đó bằng cách chuyển nó tới loadNibNamed:owner:. Đó là cửa ngõ của bạn giữa các đối tượng được tạo bởi XIB và ứng dụng của bạn.

Thông thường, đối tượng chủ sở hữu là một loại loại bộ điều khiển. Đặt lớp của chủ sở hữu tập tin trong bộ dựng giao diện cho lớp điều khiển của bạn, sau đó xác định một số IBOutlets trong lớp, chúng sẽ hiển thị trong bộ dựng giao diện trên chủ sở hữu tệp và bạn có thể kết nối các đối tượng của bạn trong XIB với chúng.

Cuối cùng, khi bạn chuyển đối tượng điều khiển của mình tới loadNibNamed:owner:, Cocoa sẽ kết nối IBOutlets của bạn với các đối tượng mới được tạo và bạn có thể sử dụng chúng để tương tác với chúng, ví dụ: để căn giữa cửa sổ trong XIB của bạn.

+0

Bạn mô tả những gì tôi đã thiết lập. Không có vấn đề với IBOutlets và tôi không cố gắng để có được một con trỏ đến một XIB. XIB chứa một NSWindow mà tôi muốn một con trỏ đến –

+0

Đó là những gì bạn sử dụng "Chủ sở hữu tệp" trong IB cho. Đó là một proxy cho đối tượng bạn truyền vào phương thức loadNibNamed :. Xem câu trả lời khác. –

+0

Vâng đó là những gì tôi mặc dù. Hóa ra vấn đề là tôi không có ổ cắm cửa sổ Chủ sở hữu của Tập tin được kết nối với đối tượng cửa sổ của XIB. –

2

Trong mã của tôi dưới đây, CustomWindow là một lớp con của NSWindow.

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

Làm thế nào để bạn có con trỏ để kiểm soát XIB sau khi bạn tải nó để bạn có thể làm những việc như định tâm NSWindow bên trong XIB?

“tập trung các NSWindow bên trong XIB” chẳng có ý nghĩa (bạn sẽ tập trung nó trên màn hình), trừ khi bạn có nghĩa là tập trung các đối tượng NSWindow đó là bên trong xib, trong trường hợp này, tại sao bạn tạo khác NSWindow (CustomWindow) đối tượng bên ngoài của xib?

Hãy nhớ rằng một nib (hoặc xib) là một kho lưu trữ các đối tượng. Nếu bạn muốn sử dụng một cửa sổ mà bạn có trong nib của bạn, bạn cần phải tạo một ổ cắm để trỏ đến cửa sổ đó, đặt lớp của Chủ sở hữu tệp thành lớp mà bạn đã thêm ổ cắm, treo ổ cắm vào IB và chỉ định đối tượng có ổ cắm làm Chủ sở hữu tệp bằng cách chuyển đối tượng đó đến đối số owner:. Đối tượng đó, với tư cách là chủ sở hữu, sau đó sẽ chịu trách nhiệm làm việc với cửa sổ. Nó có thể là (thường là, trong mã của tôi) cùng một đối tượng tải nib.

Ngoài ra, init không hoạt động trên NSWindow; bạn phải sử dụng initWithContentRect:styleMask:backing:defer: hoặc initWithContentRect:styleMask:backing:defer:screen:. Sử dụng init sẽ chỉ hợp lệ nếu bạn đã tự mình thực hiện init trong CustomWindow và sử dụng một trong hai bộ chọn này cho thông báo [super init…].

Các vấn đề liên quan