在 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
就是我所说的。您将介绍 UIActivityViewController
与 UIHostingController
我没有具体的计划,因为可能需要一些时间来制定具体细节。
【参考方案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 文档中获取第一张工作表,而不考虑工作表名称
将当前工作簿中的所有工作表复制到新工作簿,但第一张工作表除外