2010-07-17 9 views
6

Vì vậy, tôi bắt đầu học cách sử dụng Cocoa. Tôi nghĩ rằng tôi đã nhận được khá nhiều nhưng tôi đã treo lên trên tạo và chuyển đổi quan điểm. Tôi đang viết lại một trò chơi tôi đã thực hiện một chút trước đây để luyện tập. Tất cả những gì tôi muốn là một cửa sổ (tốt nhất là không thể thay đổi kích cỡ) và tôi muốn có thể chuyển đổi các khung nhìn cho các màn hình khác nhau trong trò chơi.Làm cách nào để chuyển đổi Chế độ xem trong ứng dụng Cocoa?

Trước tiên, tôi có menu chính (Bắt đầu trò chơi, Điểm cao, Thoát). Sau đó, tôi cần một cửa sổ cho mỗi màn hình (màn hình Gameplay, màn hình Highscore).

Điều tôi đang nhầm lẫn là cách thiết kế này. Tôi nhìn lên NSViewController nghĩ rằng nó quản lý quan điểm nhưng nó không. Nó chỉ quản lý một khung nhìn bằng cách tải nó thực sự. Tôi không hiểu tại sao tôi cần phải sử dụng NSViewController sau đó. Tôi không thể chỉ có một lớp cửa sổ có chứa nhiều lớp con của NSView và tải chúng như thế? Tôi không chắc tôi hiểu mục đích của ViewController.

Lớp cửa sổ của tôi có thực sự cần phải phân lớp NSWindowController không? Tôi đã cố gắng để làm theo ví dụ về ví dụ ViewController của Apple và nó có một lớp điều khiển cửa sổ đó là một lớp con của NSWindowController. Tôi không hiểu mục đích của phân lớp đó là gì. Tất cả NSWindowController dường như thêm là - initWithPath:(NSString *)newPath nhưng tôi không thấy việc sử dụng trong đó hoặc khi tôi chỉ có thể chỉnh sửa tệp plist để mở cửa sổ khi khởi động. Ví dụ của Apple cũng có biến NSView và biến NSViewController. Bạn không chỉ cần một biến để lưu trữ chế độ xem hiện tại?

Cảm ơn bạn trước, tôi thực sự bối rối về cách thức hoạt động của nó.

Trả lời

1

Sử dụng sau chức năng quy định tại UIVew (đó là một phần của cửa sổ hiện tại của bạn)

- (void)addSubview:(UIView *)view 
- (void)removeFromSuperview 
+0

Tôi đang làm ca cao trên máy tính để bàn ngay bây giờ. –

+2

cùng một giao diện có sẵn trong Desktop (NSView) –

+0

Vì vậy, những gì tôi muốn biết là tại sao tôi nên sử dụng NSViewController. Tôi có nên không? Tôi có nên tạo một lớp con của NSWindowController với biến NSView và NSViewController không? Tôi không chắc chắn điều gì thực sự cần thiết để tạo cửa sổ với chế độ xem có thể chuyển đổi. Từ sự hiểu biết của tôi, tôi không cần NSViewController chút nào nhưng tôi không biết kể từ khi ví dụ của Apple sử dụng nó và nó được cho là để làm cho mọi việc dễ dàng hơn cho bạn. –

5

Bạn sử dụng NSWindowControllerNSViewController để quản lý một cửa sổ hoặc một cái nhìn vì bạn chỉ nên cần phải tạo ra các lớp con của NSWindow hoặc NSView cho "loại" mới của cửa sổ hoặc chế độ xem. Ví dụ, nếu bạn muốn sử dụng một cửa sổ tròn, bạn sẽ phân lớp NSWindow. Nếu bạn chỉ muốn có các điều khiển trong một cửa sổ, bạn phân lớp NSWindowController.

Nó giống với NSViewController: Nói chung, chế độ xem NSViewController's sẽ thuộc một số lớp cơ sở như NSView (hoặc có thể là lớp con NSView của riêng bạn vẽ nền tùy chỉnh). NSViewController quản lý tương tác giữa các bản xem phụ của chế độ xem đó, cho phép nó hoạt động như một đơn vị duy nhất trong ứng dụng lớn hơn của bạn.

Hãy suy nghĩ theo cách này: Chế độ xem vẽ và biến các sự kiện nhập thô thành hành động cấp cao hơn. Bộ điều khiển cung cấp thông tin cho các khung nhìn và xử lý các hành động.

Soạn mọi thứ theo cách này có thể cải thiện đáng kể tính mô đun của mã của bạn, giúp việc thiết kế, viết và gỡ lỗi dễ dàng hơn.

+0

Tôi đoán điều đó có ý nghĩa hơn một chút. Bạn có nghĩ rằng tôi sẽ phải sử dụng 'initWithNibName: bundle:' để tải chế độ xem hoặc tôi có thể chỉ đặt "Chủ sở hữu tệp" của chế độ xem thành ViewController không? –

+0

Bạn cần làm cả hai. Bạn sử dụng '-initWithNibName: bundle:' để khởi tạo lớp con NSViewController của bạn. Điều đó tải tệp nib được chỉ định và đóng vai trò là Chủ sở hữu tệp của nó; đặt lớp của Chủ sở hữu tệp của nib thành lớp con NSViewController của bạn và trỏ điểm đầu ra "xem" của Chủ sở hữu tệp theo quan điểm của bạn. –

4

Có vẻ như bạn đang cố gắng hoán đổi chế độ xem nội dung trong một cửa sổ? Nếu đúng như vậy, bạn có thể sử dụng -[NSView replaceSubview:with:] với -[NSWindow contentView] làm người nhận.

Giả sử bạn có trang tiêu đề có tên titleView và trang menu có tên là menuView và bạn muốn hoán đổi chúng vào và ra khỏi cửa sổ chính của ứng dụng.Nếu tiêu đề trang có thể nhìn thấy và người dùng nhấp vào nút "chính menu" hoặc liên kết, bạn sẽ đặt một cái gì đó như thế này trong phương pháp đại biểu của nút:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView]; 

Hai điều cần phải nhận thức:

  1. Chế độ xem cũ, titleView trong trường hợp này, được phát hành bởi cuộc gọi này. Nếu bạn muốn nó vẫn có sẵn, bạn sẽ phải retain trước khi thay thế.
  2. Chế độ xem gốc sẽ không thay đổi kích thước nếu các trang của bạn có các thứ nguyên khác nhau. Thay đổi kích thước khung hình của cửa sổ, và do đó contentView là đủ dễ dàng, nhưng bạn có thể thêm một chút Hoạt hình cốt lõi vào hỗn hợp để cung cấp cho nó một số phong cách.

Tôi hy vọng điều này sẽ hữu ích!

+0

Được rồi, cảm ơn! Tôi cũng sẽ xem xét điều đó. Các bạn đều rất hữu ích. –

0

Tôi mới dùng ca cao nhưng tôi nghĩ ứng dụng của bạn không thực sự yêu cầu NSViewController. Một NSViewController đóng vai trò của "Controller" trong mẫu thiết kế MVC. Vì vậy, nó 'điều khiển' tất cả các hành động - logic keo - trong một khung nhìn duy nhất.

Ví dụ: trong chế độ xem có nhiều nút điều khiển: nút, bảng, hộp kiểm:, công cụ chọn ngày văn bản, v.v ... có khả năng tương tác chi tiết giữa các kiểm soát đó yêu cầu ràng buộc và cập nhật. Ví dụ: một lần nhấp vào nút tải tìm nạp cơ sở dữ liệu, với việc xử lý và xác thực lỗi. Đó là logic keo đi vào lớp NSViewController.

Trong ứng dụng của bạn, có vẻ như mỗi lượt xem là một trang đơn giản mà không cần kiểm soát mức xem. Vì vậy, bạn có thể cần một đơn NSWindowController, một bộ điều khiển để xử lý logic và các sự kiện để chuyển đổi từ trang này sang trang khác.

Một kỹ thuật để xử lý nhiều chế độ xem điền vào một cửa sổ duy nhất là sử dụng NSTabView và đặt kiểu tab thành 'không viền' trong IB. Sau đó, sử dụng nút hành động để chọn NSTabViewItem bắt buộc. Trong quá trình phát triển, hãy đặt kiểu xem tab thành 'tab trên cùng' và IB cho phép bạn tab qua các bản xem trước bạn muốn hiển thị.