我基于 iOS Document Based 应用模板在 Xcode 11.2 中创建了一个新应用。然后,我将文档类型修改为自定义类型,并进行了一些小改动,以便在制作新文档时使用包中的文件作为模板。我单独留下了默认样板的其余部分。我尝试构建应用程序(使用 iPhone 和 iPad 目标)并尝试创建一个新应用程序。什么都没有发生,没有引发错误,didRequestDocumentCreationWithHandler
也没有调用委托函数(我添加了一个 print 语句作为第一行以确保)。为什么是这样?我做了什么改变来打破这个?
有趣的是,在进行任何更改之前,在构建之后,文档视图的“浏览”窗格有一个“创建文档”图标(中间有一个加号的空白方块),但在进行更改之后,该图标和文件夹名字都消失了(破碎|预期):
我怀疑这个错误在我的 info.plist 中有些微妙:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>Lifreyan Layout</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>name.cableray.lifreyanlayout</string>
</array>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportsDocumentBrowser</key>
<true/>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeDescription</key>
<string>Lifreyan Script Layout</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>name.cableray.lifreyanlayout</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>lifreyanlayout</string>
<key>public.mime-type</key>
<string>name.cableray.lifreyanlayout</string>
</dict>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array/>
</dict>
</plist>
以防万一,我的文档浏览器代表:
import UIKit
import SwiftUI
class DocumentBrowserViewController: UIDocumentBrowserViewController, UIDocumentBrowserViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
allowsDocumentCreation = true
allowsPickingMultipleItems = false
}
// MARK: UIDocumentBrowserViewControllerDelegate
func documentBrowser(_ controller: UIDocumentBrowserViewController, didRequestDocumentCreationWithHandler importHandler: @escaping (URL?, UIDocumentBrowserViewController.ImportMode) -> Void) {
print("importing new")
let newDocumentURL = Bundle.main.url(forResource: "Default", withExtension: "lifreyanlayout")
// Set the URL for the new document here. Optionally, you can present a template chooser before calling the importHandler.
// Make sure the importHandler is always called, even if the user cancels the creation request.
if newDocumentURL != nil {
importHandler(newDocumentURL, .copy)
} else {
importHandler(nil, .none)
}
}
func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentsAt documentURLs: [URL]) {
guard let sourceURL = documentURLs.first else { return }
// Present the Document View Controller for the first document that was picked.
// If you support picking multiple items, make sure you handle them all.
presentDocument(at: sourceURL)
}
func documentBrowser(_ controller: UIDocumentBrowserViewController, didImportDocumentAt sourceURL: URL, toDestinationURL destinationURL: URL) {
// Present the Document View Controller for the new newly created document
presentDocument(at: destinationURL)
}
func documentBrowser(_ controller: UIDocumentBrowserViewController, failedToImportDocumentAt documentURL: URL, error: Error?) {
// Make sure to handle the failed import appropriately, e.g., by presenting an error message to the user.
}
// MARK: Document Presentation
func presentDocument(at documentURL: URL) {
let document = Document(fileURL: documentURL)
// Access the document
document.open(completionHandler: { success in
if success {
// Display the content of the document:
let view = DocumentView(document: document, dismiss: {
self.closeDocument(document)
})
let documentViewController = UIHostingController(rootView: view)
self.present(documentViewController, animated: true, completion: nil)
} else {
// Make sure to handle the failed import appropriately, e.g., by presenting an error message to the user.
}
})
}
func closeDocument(_ document: Document) {
dismiss(animated: true) {
document.close(completionHandler: nil)
}
}
}
我已经将我的项目与工作示例进行了比较,但找不到任何重大差异......