У меня есть сложное приложение, написанное на 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
Открытие общего листа из пользовательского оповещения ⇐ IOS
Программируем под IOS
-
Anonymous
1729911552
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
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79127739/opening-share-sheet-from-custom-alert[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия