2013-07-29 41 views
13

Tôi đang thực hiện một bảng điều khiển mở tệp đơn giản trong ứng dụng Cocoa của mình. Tôi bật quyền lợi và ứng dụng hộp cát. Nhưng trên OS X 10.9, khi ứng dụng cần mở một hộp thoại sử dụng NSOpenPanel, nó bị treo với:Ứng dụng Sandboxed & NSOpenPanel gây ra sự cố

Application Thông tin cụ thể:
Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSObjectNotAvailableException', lý do: 'com.apple dịch vụ .appkit.xpc.openAndSavePanelService không thể khởi tạo phiên bản NSOpenPanelService thay mặt do { "proxy-truyền thông-lỗi" = "Miền lỗi = NSCocoaErrorDomain Code = 4099 \" \ U041d \ U0435 \ U0443 \ U0434 \ U0430 \ U043b \ U043e \ U0441 \ U044c \ U0443 \ U0441 \ U0442 \ U0430 \ U043d \ U043 \ U044c \ U0441 \ U0432 \ U044f \ U0437 \ U044c \ U0441 \ U043f \ U0440 \ U043e \ U0433 \ U0440 \ U0430 \ U043c \ U043c \ U043e \ U0439- \ U043f \ U043e \ U043c \ U043e \ U0449 \ U043d \ U0438 \ U043a \ U043e \ U043c. \ "(Kết nối đã bị vô hiệu từ quá trình này.) UserInfo = 0x61000047dc00 {NSDebugDescription = Kết nối đã bị vô hiệu từ quá trình này.}"; }'

Nguồn:

self.panel = [NSOpenPanel openPanel]; 
panel.delegate = self; 
panel.canChooseDirectories = YES; 
panel.canChooseFiles = NO; 
panel.canCreateDirectories = YES; 
panel.allowsMultipleSelection = NO; 
[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) { 
     ... 
    }]; 

Có ai thấy điều này trước đây chưa?

+0

Vui lòng thêm mã mà tạo ra lỗi này – Beryllium

+0

Bạn đã bao giờ con số này ra? Tôi đang gặp vấn đề tương tự. – robertmiles3

Trả lời

3

Tôi nghĩ rằng bạn cần kích hoạt "Tệp do người dùng chọn" trong các quyền của ứng dụng của bạn!

Hãy thử, trong xcode 5 beta trông như thế này, trong xcode 4 phải ở trên trang chung của dự án của bạn, nơi bạn kích hoạt các quyền lợi!

cho tôi biết!

--------- Chỉnh sửa

Vâng, tôi nghĩ vấn đề của bạn là cách bạn gọi bảng điều khiển.

Đầu tiên, khởi tạo bảng với:

NSOpenPanel * openDlg = [NSOpenPanel openPanel]; 

[openDlg setCanChooseFiles:NO]; 
[openDlg setAllowsMultipleSelection:NO]; 
[openDlg setCanChooseDirectories:YES]; 
[openDlg setCanCreateDirectories:YES]; 

cuối cùng, thay đổi hộp thoại "gọi là" từ:

[self.panel beginSheetModalForWindow:contextWindow completionHandler:^(NSInteger returnCode) { ... }]; 

tới:

if ([openDlg runModal] == NSOKButton) 
{ here you manage the user choice. } 

Nó sẽ làm việc bây giờ!

+0

Tôi chỉ định ** "com.apple.security.files.user-selected.read-write" ** quyền lợi. Nó chỉ bị treo trên OS X 10.9. – VKorsun

+0

Tôi đã chỉnh sửa câu trả lời của mình, hãy kiểm tra nó! – Benz

0

Ứng dụng OS X của tôi "Tạo khuôn mặt" cũng gặp sự cố khi cố gắng gọi một bảng điều khiển mở tệp đơn giản. Ứng dụng không gặp sự cố, nhưng cửa sổ "chọn tệp để mở" bắt đầu lung linh, ánh sáng pixel trong hộp thoại bắt đầu nhấp nháy và nhấp chuột có tác động bị trì hoãn từ bất kỳ đâu trong khoảng từ 20 đến 40 giây. Rất siêu thực. Điều này chỉ xảy ra ở Mavericks 10.9.

Quyền lợi hộp cát "com.apple.security.files.user-selected.read-write" được bật, vì nó đã được sử dụng cho tất cả các lần tải lên trước đó của ứng dụng. Tuy nhiên, dưới Mavericks, "hội chứng mở bảng điều khiển ánh sáng throbbing" làm cho việc mở một người dùng đã chọn tệp JPEG hoặc PNG từ bên trong ứng dụng một chuyến đi rất gập ghềnh.

+0

Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? –

+0

Tôi cũng thấy điều này. Tôi đang ở trên Mavericks và không thể kiểm tra nó trên bất cứ thứ gì khác. Nhưng, lần đầu tiên tôi mở NSOpenPanel, phải mất * mãi mãi * ... như bạn đã nói 20-40 giây. Lần thứ hai tôi gọi nó, nó có vẻ là tốt. Lái xe cho tôi điên! – robertmiles3

26

Thật vậy, bạn phải cho phép cụ thể quyền Đọc/Ghi đối với các tệp do người dùng chọn. Trong Xcode 5.1, nó nằm trong Capabilities - App Sandbox.

enter image description here

+0

Vô cùng hữu ích! Cảm ơn bạn Jay. – ixany

+0

Đây là câu trả lời đúng cho trường hợp của tôi. Cảm ơn bạn! – Jim75

0

Trong trường hợp của tôi là vấn đề đối với lỗi này được gọi [NSOpenPanel openPanel] trên một sợi mà không phải là một trong những chính. Bao bọc toàn bộ điều bên trong một

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSSavePanel *saveAsPanel = [[NSSavePanel alloc] init]; 
    // ... bla bla... 
}); 

giải quyết vấn đề