2010-10-11 22 views
7

Điều này có vẻ như nó phải dễ dàng nhưng tôi phải thiếu một cái gì đó. Tôi có một ứng dụng dựa trên tài liệu. Tôi cũng đã xây dựng một XIB mới có một NSTableView và ba nút trên nó mà tôi dự định hiển thị một danh sách các tập tin trước đó. Tôi muốn XIB này được hiển thị thay vì cửa sổ tài liệu khi ứng dụng đầu tiên bắt đầu. Sau khi người dùng chọn một tệp cũ hoặc nhấn nút "Mới", tôi muốn sau đó chuyển đến cửa sổ tài liệu. Điều này là rất phổ biến và tôi đã nhìn thấy được sử dụng khá thường xuyên.Bắt đầu một ứng dụng dựa trên tài liệu Cocoa hiển thị cửa sổ lựa chọn đầu tiên

Trong nỗ lực của tôi để làm việc này, tôi đã sửa đổi tệp project-info.plist và thay đổi Tên cơ sở tệp chính NIB từ MyDocument thành tên XIB lựa chọn của tôi. Điều này làm cho ứng dụng hiển thị cửa sổ Lựa chọn thay vì cửa sổ MyDocument. Dường như không có vấn đề gì cho đến thời điểm này.

Trong cửa sổ Lựa chọn của tôi, tôi đã thiết lập chế độ xem bảng và bộ điều khiển mảng và bộ điều khiển cửa sổ tùy chỉnh chỉ dành cho XIB này. Tôi đã đặt Chủ sở hữu tệp thành bộ điều khiển cửa sổ mới và ràng buộc thuộc tính cửa sổ của trình điều khiển cửa sổ vào cửa sổ và thuộc tính ủy nhiệm của Window cho Chủ sở hữu tệp cũng như các nút "Chọn", "Hủy" và "Mới". Không có gì bị ràng buộc với NSApplication. Nhưng điều kỳ lạ là khi tôi chạy ứng dụng này có vẻ như muốn kết nối các bộ điều khiển này với NSApplication với lỗi (tương tự cho hai nút còn lại):

Không thể kết nối hành động chọnButton: để nhắm mục tiêu lớp NSApplication

Nó cũng hiển thị lỗi mà NSApplication không tuân thủ Key-Value phù hợp với ổ cắm chứa tham chiếu đến mảng của tôi. Bộ điều khiển Mảng, Cửa sổ và các nút không bị ràng buộc với NSApplication nhưng với Bộ điều khiển cửa sổ mới. Tôi đã có thể mong đợi rằng nếu có bất kỳ vấn đề là sẽ không đề cập đến NSApplication mà là bộ điều khiển cửa sổ mà các bộ điều khiển bị ràng buộc.

Bất kỳ ai biết điều gì đang xảy ra ở đây? Đây có phải là vấn đề về Hành động mục tiêu vì tôi đã thay đổi "Tên cơ sở tệp chính NIB" từ "Menu chính" thành "Lựa chọn" không? Nếu tôi không phải thay đổi điều này, thì làm thế nào tôi có thể nhận được Cocoa cho phép tôi để hiển thị một màn hình lựa chọn trước khi hiển thị cửa sổ tài liệu?

Bất kỳ trợ giúp nào được đánh giá cao. Rob

Trả lời

9

Cài đặt trong IB cho lớp của Chủ sở hữu tệp của ngòi chỉ là tư vấn; nó cho phép IB chỉ hiển thị các cửa hàng và hành động được cung cấp bởi các trường hợp của lớp đó. Nó không bắt buộc Chủ sở hữu tệp sẽ là một cá thể của lớp đó, bởi vì Chủ sở hữu tệp không phải là một phần của ngòi bút.

Chủ sở hữu tệp là đối tượng tải ngòi bút. Điều này nhất thiết có nghĩa là nó nằm ngoài ngòi, và không có gì trong nib xác định bất cứ điều gì về nó. Trong trường hợp của Mainiben nib, File's Owner - đối tượng nạp Mainibenu nib — là cá thể NSApplication. Vì vậy, tất cả mọi thứ bạn nối với chủ sở hữu tập tin trong nib MainMenu của bạn, bạn nối với đối tượng ứng dụng, mặc dù bạn nói với IB rằng nó sẽ không được ứng dụng.

Ứng dụng đó là chủ sở hữu của nib MainMenu — bất kể bạn nói gì với IB — không phải là lỗi. Ứng dụng này là luôn là chủ sở hữu của ngòi MainMenu. Điều đó là bình thường và chính xác; bạn không thể thay đổi nó, không nên cố gắng thay đổi nó, và không cần thay đổi nó.

Lỗi, tóm lại, là bạn đang sử dụng một ngòi cho hai mục đích rất khác nhau.

Bạn nên để Mainibenu nib ở một mình — chỉ chứa MainMenu, bộ điều khiển tài liệu tùy chỉnh của bạn (tôi sẽ đến đó một lúc) và ứng dụng của bạn ủy quyền — và di chuyển cửa sổ tài liệu trước đó thành một phần riêng biệt nib, thuộc sở hữu của bộ điều khiển cửa sổ tài liệu trước. Để có một bộ điều khiển cửa sổ là chủ sở hữu của nib này, bạn cần phải có bộ điều khiển cửa sổ tải nó. Bạn phải làm điều đó trong mã - bạn không thể thiết lập điều đó trong IB hoặc trong một plist.

Trong ủy nhiệm ứng dụng của bạn, khởi tạo và sở hữu bộ điều khiển cửa sổ. Có vẻ như bạn đã tạo một lớp con NSWindowController tùy chỉnh, vì vậy bạn có thể ghi đè lên số init để nó tự gửi thông báo initWithWindowNibName: để tải và sở hữu ngòi bút. Sau đó, chỉ cần sử dụng allocinit để tạo bộ điều khiển cửa sổ từ đại biểu ứng dụng.

Điều đó sẽ loại bỏ thông báo trên bàn điều khiển và đảm bảo rằng các nút thực sự được nối với bộ điều khiển cửa sổ (vì chúng được nối với Chủ sở hữu tệp, với thay đổi này, sẽ là bộ điều khiển cửa sổ) .

Yêu cầu đại biểu ứng dụng của bạn phản hồi applicationOpenUntitledFile: bằng cách gửi trình điều khiển cửa sổ thông báo showWindow:. Điều này sẽ làm cho cửa sổ tài liệu trước xuất hiện bất cứ lúc nào người dùng thông thường sẽ tạo một tài liệu mới.

Nếu bạn muốn hỗ trợ các phương pháp tạo tài liệu thông thường (ví dụ: cho phép Tài liệu mới hoạt động), sau đó triển khai applicationDidFinishLaunching:applicationShouldHandleReopen:hasVisibleWindows:, không phải applicationOpenUntitledFile:. Đảm bảo không có tài liệu nào đang mở và hiển thị cửa sổ của bạn nếu trường hợp đó xảy ra.

Bạn cũng nên tạo một lớp con tùy chỉnh của NSDocumentController và làm cho trình điều khiển tài liệu của bạn là một trường hợp, thực hiện addDocument:removeDocument: để hiển thị lại cửa sổ tài liệu trước đó khi tài liệu mở cuối cùng bị đóng và ẩn nó khi một tài liệu được mở ra.

+0

Điều này đã giúp ích rất nhiều. Một số trong những gì đã ném tôi ra là các ứng dụng tài liệu sử dụng dữ liệu lõi không tự động tạo ra các ứng dụng đại biểu. Một khi tôi tạo ra các đại biểu tôi đã có thể dừng việc tạo tự động và sau đó mở cửa sổ ban đầu của tôi. Cảm ơn nhiều! – Rob

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