Quero adicionar a API iOS16 para 'contextMenu forSelectionType: menu:', mas também preciso oferecer suporte ao iOS15, então preciso de uma condicional ViewModifier
para isso. Estou lutando com a sintaxe correta para isso.
Pelo que pude perceber, é assim que ViewModifier
deveria ser:
struct CompatibilityListContextMenuModifier<V>: ViewModifier where V: View {
let menu: (Set<Person.ID>) -> V
func body(content: Content) -> some View {
if #available(iOS 16.0, macOS 13.0, *) {
content
.contextMenu(forSelectionType: Person.ID.self, menu: menu)
} else {
content
}
}
}
Mas como faço para usar isso na minha lista:
List (selection: $contactsListOptions.multiSelectedContacts){
// ...
}
.modifier(CompatibilityListContextMenuModifier(menu: items in {
if items.isEmpty { // Empty area menu.
Button("New Item") { }
} else if items.count == 1 { // Single item menu.
Button("Copy") { }
Button("Delete", role: .destructive) { }
}
else {
Button("MultipleSelection Items") { }
}
}))
Isso me dá um erro de sintaxe:
Não é possível encontrar 'itens' no escopo
Se eu tentar passar a ligação de seleção:
.modifier(CompatibilityListContextMenuModifier(menu: contactsListOptions.multiSelectedContacts in {
if contactsListOptions.multiSelectedContacts.isEmpty { // Empty area menu.
Button("New Item") { }
} else if contactsListOptions.multiSelectedContacts.count == 1 { // Single item menu.
Button("Copy") { }
Button("Delete", role: .destructive) { }
}
else {
Text("MultipleSelection Items")
}
}))
Eu recebo o erro:
Não é possível converter o valor do tipo 'Set<Person.ID>' (também conhecido como 'Set') para o tipo de argumento esperado '(Set<Person.ID>) -> V' (também conhecido como '(Set) -> V')
e
O parâmetro genérico 'V' não pôde ser inferido
Qual é a maneira correta de compilar condicionalmente esta API?
A sintaxe para criar o modificador deve ser:
O parâmetro de fechamento deve ficar dentro do arquivo
{ ... }
.O encerramento também deve ser um
@ViewBuilder
, caso contrário você não poderá usarif
instruções como essa no encerramento.Agora você pode usá-lo assim:
Eu também sugiro que você escreva sua própria
View
extensão para escrever isso de forma mais conveniente: