3

在此处输入图像描述

我正在为iOS 14(目前正在开发Beta )项目使用新的“ DocumentGroup ”场景,我真的不知道如何检测导航栏中的事件,例如按“<”或返回(见屏幕) “DoucmentGroup”场景的预定义导航栏。对于自定义按钮,它是可能的,并且改变栏的样式(如灰色)也没什么大不了的。我尝试禁用按钮,向导航栏添加新按钮等。以下示例是您要在 Xcode 中创建新的基于文档的应用程序时的标准代码:

@main struct DocumentAppApp: App {
@SceneBuilder var body: some Scene {
    
    // Adding of a new document
    DocumentGroup(newDocument: DocumentAppDocuments()) { file in
        ContentView(document: file.$document) // .navigationBarBackButtonHidden(true)
    }
}

}

struct ContentView: View {
@Binding var document: DocumentAppDocuments

var body: some View {
    TextEditor(text: $document.text)
}

}

4

3 回答 3

4

我最终在我的文档中执行了以下操作ContentView.body

        NavigationView {
            SideBar(document: $document)
                .navigationBarItems(leading: Button("Back") {
                    // figure out how to programmatically go back...
                })
            
            Text("Nothing selected")
        }
        .navigationBarHidden(true)

我基本上杀死NavigationView了文档浏览器附带的自动功能。由于许多原因,这并不理想,其中第一个是我实际上还没有弄清楚如何回去。如果我们可以访问底层NavigationView,这样我就可以设置我的侧边栏和我的内容,这不会是一个问题,但到目前为止我在这里也没有成功。

DocumentGroup虽然有点像半生不熟的垃圾。为什么要推送,而不是呈现在“空”文档上?为什么我不能设置DocumentGroup等的强调色。我已经为这些项目写了反馈,但谁知道它是否会在发布前得到解决。

最后一个选择是自己接管它,根本不使用它DocumentGroupUIDocumentBrowserViewController用作一个UIViewControllerRepresentable并继续你的生活。我可能很快就会来到这里。

更新:我放弃了DocumentGroup. 这没有任何意义。推送内容?哑的。改变色调?不能。我的应用也去掉了 SwiftUI 应用入口,所以我可以完全控制 UIDocumentBrowserViewController,我建议你也这样做。唯一困难的部分是弄清楚如何最好地利用UIDocument基于存储而不是更好的FileDocumentSwiftUI 提供的存储。为此,我基本上是这样做的:

final class Document: UIDocument, ObservableObject {

   var someDocumentProperty: String = "" {
     willSet {
       // this updates the SwiftUI view hierarchy
       objectWillChange.send()
     } didSet {
       // this will autosave whenever you change this property
       updateChangeCount(.done)
     }
   }
}

现在它将完全适用于 SwiftUI 视图,正确保存一切。

于 2020-08-04T10:13:40.370 回答
1

完全相同的问题。简而言之,我决定看看是否还有 UIApplication.shared 正在创建,并且当我能够以编程方式返回时,如下所示:

private func goBack() {
#if canImport(UIKit)
guard let currentWindow = UIApplication.shared.windows.first,
      let documentBrowser = currentWindow
      .rootViewController as? UIDocumentBrowserViewController
else
{
  logw(
    "<\(#fileID) \(#function)> Failed to retrieve document browser."
  )
  return
}

documentBrowser.dismiss(animated: true) {
  logi("<\(#fileID) \(#function)> the document browser has dismissed it's child.")
}

#endif

}

或简化:

`UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true) { print("the document browser has dismissed it's child.") }`
于 2021-01-27T22:09:11.340 回答
0

我的目标是注入自己的功能,同时保持系统后退按钮的外观和感觉,由DocumentGroup. 请注意,我的文档视图是UIViewControllerUIViewControllerRepresentable. 该解决方案基于 Jason Cardwell 的:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    var systemBackButtonItem = navigationController?.navigationBar.items?[0].leftBarButtonItems?[0]
    systemBackButtonItem?.target = self
    systemBackButtonItem?.action = #selector(done)
}

@objc private func done() {
    UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true) { 
        print("the document browser has dismissed it's child.") 
    }
}

不过要小心,这可能会与 DocumentGroup 提供的某些功能发生冲突。但是,到目前为止,就我而言,一切都很好。另外的选择:

    private weak var originalBackButtonTarget: AnyObject?
    private var originalBackButtonAction: Selector?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        var systemBackButtonItem = navigationController?.navigationBar.items?[0].leftBarButtonItems?[0]
        originalBackButtonTarget = systemBackButtonItem?.target
        systemBackButtonItem?.target = self
        originalBackButtonAction = systemBackButtonItem?.action
        systemBackButtonItem?.action = #selector(done)
    }

    @objc private func done() {
        guard let originalBackButtonAction = originalBackButtonAction else { return }
        originalBackButtonTarget?.perform(originalBackButtonAction, with: self)
    }
于 2021-12-14T20:56:33.617 回答