Sự khác biệt giữa iOS và OS X là chỉ có một cửa sổ trong iOS nhưng có thể có nhiều cửa sổ trong OS X. NSViewControllers
trong OS X hoạt động khác với UIViewControllers
trong đó NSViewController
được thiết kế để tải và xử lý một lượt xem, trong khi UIViewControllers
(xin lỗi vì sự thiếu liên quan của tôi về kiến thức iOS) dường như xử lý nhiều lượt xem và cung cấp nhiều hơn nữa việc dán giữa các chế độ xem.
Ngay cả những Apple docs viết rằng:
Trong Mac OS X, AppKit xem bộ điều khiển là người giúp việc điều khiển cửa sổ , đó là cuối cùng chịu trách nhiệm về tất cả mọi thứ mà đi trong cửa sổ.
Do đó, đối ứng cho UIViewController
trong OS X không phải là NSViewController
, nhưng thay vì NSWindowController
, mà cung cấp cho OS X phần lớn những gì UIViewController
không dành cho iOS bằng cách quản lý toàn bộ một cửa sổ riêng biệt và cách bố trí/nội dung/tương tác của các khung nhìn bên trong.
Trong trường hợp của bạn, tôi sẽ sử dụng một số NSWindowController
- mặc dù nếu ứng dụng rất đơn giản, các hoạt động App Delegate
cũng vậy; và nếu ứng dụng rất phức tạp, thì việc sử dụng NSViewController
để chia nhỏ mã sẽ không phải là một ý tưởng tồi.
Cách tốt nhất để làm sử dụng một NSWindowController
sẽ được programatically tải nó trong App Đại biểu sử dụng [[CustomWindowController alloc] init]
và
@implementation CustomWindowController
- (id)init
{
self=[super initWithWindowNibName:@"CustomWindowNibName"];
if(self)
{
//perform any initializations
}
return self;
}
@end
Hoặc gọi
[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"];
trực tiếp (và trọng initWithWindowNibName) nếu bạn muốn nó có thể tái sử dụng được.
Và bạn có thể xóa cửa sổ mặc định trong MainMenu.xib.
Về cơ bản, thường xuyên hơn không, NSWindowController quản lý cửa sổ được khởi tạo trong tệp nib của chính nó. NSWindowController thường sở hữu tệp nib đó. (Mặc dù có thể quản lý cửa sổ được tạo theo chương trình, thường không phải như thế nào.)
Để có thể sử dụng tùy chỉnh NSWindowController
, do đó bạn cần phải quản lý cửa sổ của mình trong một tệp nib/xib riêng biệt.(sử dụng tệp xib mặc định có nghĩa là bạn cho phép Cocoa tự động khởi tạo một NSWindowController mà không có cơ hội cho phân lớp; bạn không thể sử dụng tùy chỉnh NSWindowController
với NSMainNibFile mặc định. Đối với một ứng dụng đơn giản, chỉ cần đặt tất cả mã bộ điều khiển trong NSApplication/App Delegate)
trong Xcode 4 ít nhất, quá trình này liên quan đến việc tạo ra một xib với mẫu cửa sổ và các lớp tùy chỉnh NSWindowController
, instantiating lớp CustomWindowController
trên cơ sở đó nib trong init hoặc bất cứ nơi nào và sau đó gọi [CustomWindowController showWindow:self];
(hoặc nếu đó không làm việc, -makeKeyAndOrderFront:
) để cửa sổ hiển thị thực tế (trong - (void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification
có thể là một nơi tuyệt vời).
Để ngăn cửa sổ mặc định hiển thị, tôi chỉ cần xóa nó. Có lẽ có một cách tốt hơn nhưng tôi không biết điều đó.
Vâng tôi cho rằng tôi cần sử dụng NSWindowController nhưng tôi không chắc chắn cách móc nó lên NSWindow. Tôi kéo một cửa sổ mới vào MainMenu.xib và thiết lập nó nhưng nó đã được nạp khi tôi chạy ứng dụng. Tôi cũng đã thử sử dụng AppDelegate chỉ để bắt đầu nhưng tôi không biết cách làm ví dụ. làm cho NSTableView của tôi nhìn vào AppDelegate.m cho các phương thức nguyên mẫu NSTableViewDataSource. Tôi đã thử kết nối từ bảng đến 'Chủ sở hữu tệp' và đã chọn nguồn dữ liệu nhưng không thành công với lỗi 'nguồn dữ liệu chế độ xem không hợp lệ NST'. – TijuanaKez
Cách dễ nhất để kết nối NSWindowController là chia nhỏ các tệp nib của bạn và cho nó tải tệp riêng của nó. Vì vậy, tạo một tệp nib mới bằng cách sử dụng mẫu cửa sổ và đặt Chủ sở hữu tệp thành bộ điều khiển. Ngoài ra, về nỗ lực của bạn để kết nối với dataSource: 'Chủ sở hữu tệp' trong trường hợp đó là NSApplication; bạn muốn kéo đến App Delegate để thay thế. – Vervious
Ok vì vậy tôi đã thực hiện một bộ điều khiển mới 'MainWindowController' và đánh dấu 'với tập tin xib'. Tôi đã sao chép NSwindow từ MainMenu.xip và dán nó vào tệp MainWindowController.xib mới xóa tệp cũ. 'Lớp tùy chỉnh' của Chủ sở hữu tệp được đặt thành MainWindowController. Tôi đã thêm phương thức init tùy chỉnh vào MainWindowController.m với 'self = [super initWithWindowNibName: @" MainWindowController "];'. Tôi khởi tạo thuộc tính MainWindowController của mình trong phương thức 'applicationDidFinishLaunching' của ứng dụng với' mainWindow = [[MainWindowController alloc] init]; '.. không có lỗi nhưng không có cửa sổ. Bất cứ điều gì tôi bị mất? – TijuanaKez