2012-04-12 22 views
9

Sau khi rối tung xung quanh với các ứng dụng iOS, tôi nghĩ rằng tôi muốn cung cấp cho một ứng dụng Cocoa một whirl giả định mọi thứ sẽ rất giống nhau. Vì vậy, tôi có một ứng dụng cửa sổ duy nhất với một cái nhìn phân chia và một số NSTableView s (nghĩ rằng iTunes) và tôi đang tìm một nơi để đặt mã của tôi mà sẽ lấy dữ liệu từ trang web để điền vào các bảng.(Cocoa) Tương đương với lớp con UIViewController trong một ứng dụng ca cao cửa sổ đơn là gì?

Trong iOS, tôi sẽ đặt phương thức này theo phương thức viewDidLoad của lớp con UIViewController thích hợp. Sau đó, UITableViewDataSource sẽ truy cập dữ liệu này để điền các ô của nó.

Bây giờ tôi có một số NSWindow mà tôi có thể làm một điều tương tự nhưng làm cách nào để tạo một NSWindowController cho nó? Đây có phải là điều tôi muốn không? Tôi có thể đặt nó trong AppDelegate nhưng dường như không đúng.

Trả lời

12

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]

@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 đó.

+0

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

+0

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

+0

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

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