Открытие общего листа из пользовательского оповещенияIOS

Программируем под IOS
Ответить
Anonymous
 Открытие общего листа из пользовательского оповещения

Сообщение Anonymous »

У меня есть сложное приложение, написанное на SwiftUI, в котором я пытаюсь открыть общий лист из специального оповещения. Я написал пример приложения, в котором общий лист никогда не открывается из оповещения. Я также хочу отображать настраиваемое оповещение для любого представления/листа, открытого в приложении, поэтому я представляю его в полноэкранном режиме.
Настраиваемое оповещение имеет две кнопки — «ОК» и «Поделиться листом». При нажатии кнопки «Поделиться листом» приложение должно открыть общий лист.
Поделиться своим кодом для основного представления, настраиваемого представления оповещений и кода общего листа. Что делаю не так, из-за чего не открывается общий лист?
import Foundation
import SwiftUI
import UIKit

@MainActor
class ContentViewModel: ObservableObject {
@Published var showAlert = false
}

struct ContentView: View {
@StateObject var contentViewModel: ContentViewModel = ContentViewModel()

var body: some View {
VStack {
Button {
contentViewModel.showAlert = true
} label: {
Text("Tap me to open a custom alert")
}
.offset(y: -200)
}
.showCustomAlert(isPresented: $contentViewModel.showAlert)
}
}

// MARK: Code for custom alert view.

struct CustomAlertView: ViewModifier {
@Binding var isPresented: Bool
@Environment(\.dismiss) var dismiss

init(isPresented: Binding) {
self._isPresented = isPresented
}

func body(content: Content) -> some View {
content.fullScreenCover(isPresented: $isPresented) {
alertContent().presentationBackground(Color.black.opacity(0.3))
}
.transaction { transaction in
transaction.disablesAnimations = true
}
}

@ViewBuilder
private func alertContent() -> some View {
GeometryReader { geometry in
if self.$isPresented.wrappedValue {
VStack {
Text("This is a custom alert.")
.font(.title2).bold().multilineTextAlignment(.center)
.padding([.leading, .trailing], 20.0).padding(.top, 16.0)
Spacer()
Text("Tap 'Share Sheet' button to open share sheet.").foregroundColor(Color.secondary).font(.body).multilineTextAlignment(.center)
.padding([.leading, .trailing], 18.0).padding(.top, 16.0)
Spacer()
HStack {
Button {
self.$isPresented.wrappedValue.toggle()
} label: {
Text("OK")
}
.frame(width: 200, height: 50)

Button {
// Open share sheet and dismiss the alert.
ShareSheet.shared.open(subject: "This is subject", content: "This is content")
self.$isPresented.wrappedValue.toggle()
} label: {
Text("Share Sheet")
}
.frame(width: 200, height: 50)

}.padding(.top, 16.0).padding(.bottom, 24.0)
}
.fixedSize(horizontal: false, vertical: true)
.background(Color.gray.opacity(0.75))
.cornerRadius(28)
.clipped()
.padding([.leading, .trailing], 5.0)
.position(x: geometry.size.width/2, y: geometry.size.height/2)
.frame(width: 315.0)
}
}
}
}

extension View {
func showCustomAlert(isPresented: Binding) -> some View {
return modifier(CustomAlertView(isPresented: isPresented))
}
}

// MARK: Code for share sheet.

class ShareSheet {
static let shared = ShareSheet()
typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void

let applicationActivities: [UIActivity]? = nil
let excludedActivityTypes: [UIActivity.ActivityType]? = nil

func open(subject: String, content: String, callback: Callback? = nil) {
let controller = UIActivityViewController(activityItems: [MessageWithSubject(subject: subject, message: content)],
applicationActivities: applicationActivities)
controller.excludedActivityTypes = excludedActivityTypes
controller.completionWithItemsHandler = callback
UIWindow.getTopViewController()?.present(controller, animated: true, completion: nil)
}
}

class MessageWithSubject: NSObject, UIActivityItemSource {
let subject:String
let message:String

init(subject: String, message: String) {
self.subject = subject
self.message = message
super.init()
}

func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return message
}

func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
let activityTypeId = activityType?.rawValue ?? ""

if (activityTypeId == "com.apple.mobilenotes.SharingExtension") || (activityTypeId == "com.google.Gmail.ShareExtension") {
let combined = subject + "\n\n" + message
return combined
}

return message
}

func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
return subject
}
}

extension UIWindow {
static func getTopViewController() -> UIViewController? {
let keyWindow = (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first
if var topController = keyWindow?.rootViewController {
while let presentedViewController = topController.presentedViewController {
topController = presentedViewController
}
return topController
}

return nil
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... stom-alert
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»