Tôi đã cố gắng để có được một cửa sổ để hiển thị yêu cầu người đó chọn một tập tin, và cuối cùng tôi đã làm. Vấn đề là, Xcode phàn nàn rằng phương pháp tôi đang sử dụng không được chấp nhận. Tôi đã xem trong số class reference, nhưng mọi thứ trong phần "bảng điều khiển đang chạy" đã không được chấp nhận kể từ Mac OS 10.6. Có một lớp học khác mà tôi phải sử dụng bây giờ không?NSOpenPanel - Mọi thứ không được chấp nhận?
Trả lời
Theo như tôi biết, bạn có thể sử dụng phương pháp runModal
như hình dưới đây:
NSOpenPanel *openPanel = [[NSOpenPanel alloc] init];
if ([openPanel runModal] == NSOKButton)
{
NSString *selectedFileName = [openPanel filename];
}
Trong 10,6, đã có một vài thay đổi đến các lớp học này. Một trong những lợi ích là bây giờ có một API dựa trên khối.
Dưới đây là một đoạn mã trên làm thế nào để sử dụng:
NSOpenPanel *panel = [[NSOpenPanel openPanel] retain];
// Configure your panel the way you want it
[panel setCanChooseFiles:YES];
[panel setCanChooseDirectories:NO];
[panel setAllowsMultipleSelection:YES];
[panel setAllowedFileTypes:[NSArray arrayWithObject:@"txt"]];
[panel beginWithCompletionHandler:^(NSInteger result){
if (result == NSFileHandlingPanelOKButton) {
for (NSURL *fileURL in [panel URLs]) {
// Do what you want with fileURL
// ...
}
}
[panel release];
}];
Có vẻ như đó là mã đúng để sử dụng theo 10.10, nhưng loại bỏ các bit giữ lại và giải phóng nếu bạn đang sử dụng ARC. – smacdonald
Hoặc bạn có thể sử dụng [- beginSheetModalForWindow: completionHandler:] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/#//apple_ref/occ/instm/NSSavePanel/ beginSheetModalForWindow: completionHandler :) nếu bạn không muốn một hộp thoại mở riêng biệt. – pi3
Thấy thế nào tôi thấy câu hỏi này hữu ích sáu năm sau, và vì không có câu trả lời nhanh chóng, đây là một giải pháp nhanh chóng.
Bạn sẽ tìm thấy hai mẫu, một mẫu làm cửa sổ độc lập và một mẫu khác làm tờ.
Swift 3,0
func selectIcon() {
// create panel
let panel = NSOpenPanel()
// configure as desired
panel.canChooseFiles = true
panel.canChooseDirectories = false
panel.allowsMultipleSelection = false
panel.allowedFileTypes = ["png"]
// *** ONLY USE ONE OF THE FOLLOWING OPTIONS, NOT BOTH ***
// ********************** OPTION 1 ***********************
// use this if you want a selection window to display that is
// displayed as a separate stand alone window
panel.begin { [weak self] (result) in
guard result == NSFileHandlingPanelOKButton, panel.urls.isEmpty == false, let url = panel.urls.first else {
return
}
let image = NSImage.init(contentsOf: url)
DispatchQueue.main.async {
self?.iconImageView.image = image
}
}
// ********************** OPTION 2 ***********************
// use this if you want a sheet style view that displays sliding
// down from your apps window
panel.beginSheetModal(for: self.view.window!) { [weak self] (result) in
guard result == NSFileHandlingPanelOKButton, panel.urls.isEmpty == false, let url = panel.urls.first else {
return
}
let image = NSImage.init(contentsOf: url)
DispatchQueue.main.async {
self?.iconImageView.image = image
}
}
}
Vì vậy, '.begin' là một trình xử lý hoàn thành. Đối với những người xem trong tương lai: Bạn cũng có thể làm: 'let response = panel.runModal(); nếu response == NSApplication.ModalResponse.OK {/ * làm việc với panel.url * /}' Cũng hoạt động cho '.CANCEL' – eonist
- 1. dismissModalViewControllerAnimated không được chấp nhận
- 2. initWithContentsOfFile Không được chấp nhận
- 3. setFont Không được chấp nhận?
- 4. Livequery không được chấp nhận
- 5. getch không được chấp nhận
- 6. File.toURL() không được chấp nhận?
- 7. glEnableClientState không được chấp nhận
- 8. Enum.ToString() không được chấp nhận?
- 9. stringWithContentsOfFile Không được chấp nhận
- 10. Nhận mọi mục thứ n trong mảng
- 11. Nhóm hoạt động không được chấp nhận
- 12. NSOpenPanel Sheet
- 13. Android PowerManager WakeLock - Không được chấp nhận
- 14. Tạo: LDLIBS, không được chấp nhận?
- 15. Hibernate - AnnotationConfiguration không được chấp nhận
- 16. directoryContentsAtPath không được chấp nhận iOS 4
- 17. Xử lý android.text.ClipboardManager không được chấp nhận
- 18. TWTweetComposeViewController không được chấp nhận trong IOS6
- 19. netrc không được chấp nhận bởi git
- 20. Ý nghĩa không được chấp nhận?
- 21. Hibernate có được chấp nhận không?
- 22. -setStatusBarHidden: hoạt ảnh: không được chấp nhận
- 23. fopen cảnh báo không được chấp nhận
- 24. Tại sao Date.getTimezoneOffset không được chấp nhận?
- 25. Tại sao buildSessionFactory() không được chấp nhận?
- 26. MFC có được chấp nhận không?
- 27. RKResponseDescriptor trong RESTKit không được chấp nhận
- 28. Rails Hoàn thành 406 Không chấp nhận được
- 29. không thể đẩy vào github: mọi thứ được cập nhật
- 30. Có quy ước được chấp nhận cho thứ tự thuộc tính khai báo @property không?
@Cole Lý do bạn không thể tìm thấy phương pháp này là bởi vì nó được thực hiện bởi 'NSSavePanel', đó là 'cha NSOpenPanel' của. +1 – ughoavgfhw
Ah, cảm ơn Jesse và @ughoavgfhw. – Cole
Điều tương tự cũng đúng với cách khác, cách tốt hơn để chạy bảng lưu hoặc bảng điều khiển mở, bao gồm phương pháp chạy một trang tính dưới dạng trang tính. –