在 SwiftUI 中呈现两张工作表

Posted

技术标签:

【中文标题】在 SwiftUI 中呈现两张工作表【英文标题】:Presenting two sheets in SwiftUI 【发布时间】:2021-08-18 22:12:13 【问题描述】:

我正在尝试在 SwiftUI 中展示两张表格。第一个工作表(SecondScreen)在主页上打开(点击导航工具栏图标),第二个工作表是一个 ShareSheet,它应该作为一个选项在 SecondScreen 内弹出。我使用了一个表单来构建 SecondScreen。在模拟器和我的设备上,ShareSheet 没有出现。我希望这只是一个错误,而不是 Apple 不允许在没有大的 UI 更改的情况下发生的事情。

我尝试打开 ShareSheet,同时将 SecondScreen 作为 .fullScreenCover.,而不是 .sheet,但按钮仍然没有反应。

例子

import SwiftUI

struct ContentView: View 
    
    @State var showMore: Bool = false
    
    var body: some View 
        NavigationView 
            Text("Main Page")
                .padding()
                .navigationBarTitle("Main Page")
                .toolbar 
                    ToolbarItem(placement: .navigationBarTrailing) 

                    Button(action: 
                        showMore.toggle()
                        
                    , label: 
                        Image(systemName: "ellipsis.circle")
                    )
                    .sheet(isPresented: $showMore, content: 
                        SecondScreen()
            )
         
    
  


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


struct SecondScreen: View 
    var body: some View 
        NavigationView 
           Form 
            Section 
            Button(action: 
                    ShareID (Info: "https://www.google.com"), label:  Text("Share")
            )
            

            
            
           
        
    

func ShareID(Info: String)
    
let infoU = Info
    
let av = UIActivityViewController(activityItems: [infoU], applicationActivities: nil)
    UIApplication.shared.windows.first?
    .rootViewController?.present(av, animated: true,
    completion: nil)
    



谢谢!

【问题讨论】:

那是因为您试图在当前工作表的顶部呈现。您必须将您的共享表放在附加到当前表的 uiviewcontroller 中 所以我必须更改 .rootViewController?.present ? 是的,您的工作表目前在那里展示 我将 .rootViewController 更改为 .ContentView 和 .self。没有变化。您能否更具体地说明建议的更改?非常感谢。 您可以查看此half modal 示例。注意presentModalView() 的呈现方式。你不应该需要 ios 15 的东西,所以删除 adaptiveSheetPresentationController 下的工作表修饰符。当我说新工作表需要附加到现有工作表时,这一行hostPopover.sourceView = super.view 就是我所说的。您将介绍 UIActivityViewControllerUIHostingController 我没有具体的计划,因为可能需要一些时间来制定具体细节。 【参考方案1】:

这是弹出表单的另一种方法,甚至可以在我的 Mac 上使用:

import SwiftUI

@main
struct TestApp: App 
    var body: some Scene 
        WindowGroup 
            ContentView()
        
    


struct ContentView: View 
    @State var showMore: Bool = false
    
    var body: some View 
        NavigationView 
            Text("Main Page")
                .padding()
                .navigationBarTitle("Main Page")
                .toolbar 
                    ToolbarItem(placement: .navigationBarTrailing) 
                        Button(action:  showMore.toggle() ) 
                            Image(systemName: "ellipsis.circle")
                        
                        .sheet(isPresented: $showMore) 
                            SecondScreen()
                        
                    
                
        
    


struct SecondScreen: View 
    @State var shareIt = false
    @State var info = "https://www.google.com"
    
    var body: some View 
        Button(action: shareIt = true) 
            Text("Share")
        
        .sheet(isPresented: $shareIt, onDismiss: shareIt = false) 
            ShareSheet(activityItems: [info as Any])
        
    


struct ShareSheet: UIViewControllerRepresentable 

    typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void
    
    let activityItems: [Any]
    let applicationActivities: [UIActivity]? = nil
    let excludedActivityTypes: [UIActivity.ActivityType]? = nil
    let callback: Callback? = nil
    
    func makeUIViewController(context: Context) -> UIActivityViewController 
        let controller = UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: applicationActivities)

        controller.excludedActivityTypes = excludedActivityTypes
        controller.completionWithItemsHandler = callback
        return controller
    
    
    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context)  

【讨论】:

非常感谢。这解决了问题。正是我想要的。

以上是关于在 SwiftUI 中呈现两张工作表的主要内容,如果未能解决你的问题,请参考以下文章

如果不同工作表上的值匹配,则将数据从一张工作表复制到另一张工作表

使用 OleDb 从 Excel 文档中获取第一张工作表,而不考虑工作表名称

将同一工作簿中的多个 Excel 工作表复合到一张工作表中

将当前工作簿中的所有工作表复制到新工作簿,但第一张工作表除外

在工作簿中查找所有匹配项并将结果偏移到另一张工作表中(VBA)

Excel 一张工作表变动后,怎么自动更新另一张表中的数据