Jes*_*s M 27 xcode share swiftui ios15
我正在尝试创建一个共享表来共享 a Text
,它在 iOS 14 中工作正常,但在 iOS 15 中它告诉我:
iOS 15.0 中已弃用“windows”:改为在相关窗口场景上使用 UIWindowScene.windows。
我怎样才能让它在 iOS 15 上使用 SwiftUI 工作
Button {
let TextoCompartido = "Hola "
let AV = UIActivityViewController(activityItems: [TextoCompartido], applicationActivities: nil)
UIApplication.shared.windows.first?.rootViewController?.present(AV, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
ach*_*chi 16
我认为直接使用 SwiftUI API 会为您提供最好的服务。一般来说,我会遵循以下步骤。
View
遵循.ActivityView
UIViewControllerRepresentable
这将允许您使用UIActivityViewController
SwiftUI。Identifiable
结构体来包含您想要在ActivityView
. 创建此类型将允许您使用 SwiftUI工作表 API并利用 SwiftUI 状态来告诉应用程序何时ActivityView
显示新内容。@State
变量来保留您的Identifiable
文本结构。当该变量发生变化时,sheet API将执行回调。ActivityView
将呈现给您的用户的工作表。下面的代码应该可以帮助您入门。
import UIKit
import SwiftUI
// 1. Activity View
struct ActivityView: UIViewControllerRepresentable {
let text: String
func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityView>) -> UIActivityViewController {
return UIActivityViewController(activityItems: [text], applicationActivities: nil)
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ActivityView>) {}
}
// 2. Share Text
struct ShareText: Identifiable {
let id = UUID()
let text: String
}
struct ContentView: View {
// 3. Share Text State
@State var shareText: ShareText?
var body: some View {
VStack {
Button("Show Activity View") {
// 4. New Identifiable Share Text
shareText = ShareText(text: "Hola ")
}
.padding()
}
// 5. Sheet to display Share Text
.sheet(item: $shareText) { shareText in
ActivityView(text: shareText.text)
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
在 iOS 15 中使用 SwiftUI 进行了测试
func shareViaActionSheet() {
if vedioData.vedioURL != nil {
let activityVC = UIActivityViewController(activityItems: [vedioData.vedioURL as Any], applicationActivities: nil)
UIApplication.shared.currentUIWindow()?.rootViewController?.present(activityVC, animated: true, completion: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
为了避免 iOS 15 方法弃用警告,请使用此扩展
public extension UIApplication {
func currentUIWindow() -> UIWindow? {
let connectedScenes = UIApplication.shared.connectedScenes
.filter { $0.activationState == .foregroundActive }
.compactMap { $0 as? UIWindowScene }
let window = connectedScenes.first?
.windows
.first { $0.isKeyWindow }
return window
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下答案尝试以下操作:如何使用 AdMob 横幅删除消息“‘windows’在 iOS 15.0 中已弃用:在相关窗口场景上使用 UIWindowScene.windows”?
请注意,您的代码对我有用,但编译器给出了弃用警告。
public extension UIApplication {
func currentUIWindow() -> UIWindow? {
let connectedScenes = UIApplication.shared.connectedScenes
.filter({
$0.activationState == .foregroundActive})
.compactMap({$0 as? UIWindowScene})
let window = connectedScenes.first?
.windows
.first { $0.isKeyWindow }
return window
}
}
struct ContentView: View {
let TextoCompartido = "Hola "
var body: some View {
Button(action: {
let AV = UIActivityViewController(activityItems: [TextoCompartido], applicationActivities: nil)
UIApplication.shared.currentUIWindow()?.rootViewController?.present(AV, animated: true, completion: nil)
// This works for me, but the compiler give the deprecation warning
// UIApplication.shared.windows.first?.rootViewController?.present(AV, animated: true, completion: nil)
}) {
Text("Hola click me")
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15979 次 |
最近记录: |