Как мне представить контекстное меню SwiftUI условно? - PullRequest
0 голосов
/ 26 января 2020

Рассмотрим следующий код представления:

Text("Something")
.contextMenu {
    // Some menu options
}

Это прекрасно работает. Что я хотел бы сделать: представить contextMenu через косвенность модификатора представления. Примерно так:

Text("Something")
.modifier(myContextMenu) {
    // Some menu options
}

Почему: мне нужно сделать несколько логик c внутри модификатора для условного представления или отсутствия меню. Я не могу определить правильную сигнатуру модификатора представления для него.

Существует еще один модификатор contextMenu, который утверждает, что я могу условно представить контекстное меню для него. После этого это мне не поможет, потому что, как только я добавляю модификатор contextMenu в NavigationLink на iOS, жест касания перестает работать. Ниже приводится обсуждение в ответе.

Как представить контекстное меню с использованием модификатора вида?

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Вот что я придумал. Не совсем доволен, он может быть более компактным, но работает как положено.

struct ListView: View {    
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: ItemView(item: "Something")) {
                    Text("Something").modifier(withiOSContextMenu())
                }.modifier(withOSXContextMenu())
            }
        }
    }
}

struct withOSXContextMenu: ViewModifier {
    func body(content: Content) -> some View {
        #if os(OSX)
        return content.contextMenu(ContextMenu {
            ContextMenuContent()
        })
        #else
        return content
        #endif
    }
}

struct withiOSContextMenu: ViewModifier {
    func body(content: Content) -> some View {
        #if os(iOS)
        return content.contextMenu(ContextMenu {
            ContextMenuContent()
        })
        #else
        return content
        #endif
    }
}

func ContextMenuContent() -> some View {
    Group {
        Button("Click me") {
            print("Button clicked")
        }
        Button("Another button") {
            print("Another button clicked")
        }
    }
}


0 голосов
/ 26 января 2020

Вот демонстрационная версия для необязательного использования контекстного меню (протестировано с Xcode 11.2 / iOS 13.2)

enter image description here

struct TestConditionalContextMenu: View {
    @State private var hasContextMenu = false
    var body: some View {
        VStack {
            Button(hasContextMenu ? "Disable Menu" : "Enable Menu")
                { self.hasContextMenu.toggle() }
            Divider()
            Text("Hello, World!")
                .background(Color.yellow)
                .contextMenu(self.hasContextMenu ?
                    ContextMenu {
                            Button("Do something1") {}
                            Button("Do something2") {}
                    } : nil)
        }
    }
}
0 голосов
/ 26 января 2020

Как то так?

Text("Options")
        .contextMenu {
            if (1 == 0) { // some if statements here
                Button(action: {
                    //
                }) {
                    Text("Choose Country")
                    Image(systemName: "globe")
                }
            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...