В настоящее время используется SwiftUI со встроенной функцией ShareLink. Мне нужно вызвать другое действие одновременно с нажатием ShareLink. Эта ссылка ShareLink вложена в меню SwiftUI.
Как бы мне это сделать?
Вот пример моего кода:
struct ContentView: View {
var body: some View {
VStack {
Menu("options") {
Button {
print("button 1 is pressed")
} label: {
Text("Test Menu Button")
}
shareLinkButton
.onTapGesture {
print("ShareLink triggered!")
}
}
}
}
var shareLinkButton: some View {
ShareLink(item: URL(string: "https://stackoverflow.com/")!) {
Label {
Text("hello")
.onTapGesture {
print("HELLO")
}
} icon: {
Image(systemName: "apple.logo")
}
}
.onTapGesture {
print("ShareLink triggered!")
}
}
}
Это просто базовое меню с двумя кнопками.
Ни один из onTapGestures не срабатывает ни в какой момент. Я также пытался поместить ShareLink в кнопку, вот так:
Button {
ShareLink(item: URL(string: "https://stackoverflow.com/")!) {
Label {
Text("hello")
.onTapGesture {
print("HELLO")
}
} icon: {
Image(systemName: "apple.logo")
}
}
print("test")
} label: {
Label {
Text("hello")
.onTapGesture {
print("HELLO")
}
} icon: {
Image(systemName: "apple.logo")
}
}
Это запускает оператор печати, но не ShareLink.
Я также пытался использовать одновременный жест, но безуспешно.
Я не хочу использовать UIKit для своего решения, я бы хотел сохранить реализацию SwiftUI.
Какие-либо предложения? :)
Невозможно уловить срабатывание ShareLink внутри меню. Единственный способ справиться с этим — UIActivityViewController с Representable. :(
Apple говорит:
Люди нажимают или нажимают на ссылку общего доступа, чтобы представить интерфейс общего доступа. ссылка обычно имеет стандартный для системы вид; вам нужно только предоставить контент, которым можно поделиться
Я согласен с Blackhatsrak выше. Если вы и другие все еще ищете решение UIKit, вот оно:
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Menu("options") {
Button {
print("button 1 is pressed")
} label: {
Text("Test Menu Button")
}
customShareLinkButton
}
}
}
var customShareLinkButton: some View {
Button {
presentShareLink()
} label: {
Label("share", systemImage: "square.and.arrow.up")
}
}
func presentShareLink() {
print("your logic here")
guard let url = URL(string: "https://stackoverflow.com/") else { return }
let vc = UIActivityViewController(activityItems: [url], applicationActivities: nil)
let scene = UIApplication.shared.connectedScenes.first { $0.activationState == .foregroundActive } as? UIWindowScene
scene?.keyWindow?.rootViewController?.present(vc, animated: true)
}
}
Вы можете заменить оператор печати в функции PresentShareLink своей собственной логикой. Хотя это выглядит немного многословно, оно по-прежнему выполняет функцию представления листа ссылок для общего доступа.
Да... Я думаю, что это, к сожалению, ответ. В итоге я использовал их (UIActivityViewController и Representable). Я просто очень надеялся, что кто-то лучше разбирается в этом и, возможно, сможет перепроектировать это лучше, чем я! Возможно, кто-то другой найдет его и обновит позже, но на данный момент я выбрал это решение. Также спасибо!