SwiftUI - Lista: Ocultar divisor no iOS 13+
Desenvolvi uma tela de chat usando SwiftUI. A versão mínima atual do iOS é 13.0.
Para fazer o chat, utilizo o elemento List com ForEach. O problema é que a lista mostra as divisórias e preciso ocultá-las:
Tentei ocultar o estilo do TableView, mas nada funciona. Aqui está o código:
struct MessagesView: View {
var messages: [MessageModel] = []
init() {
// To remove only extra separators below the list:
UITableView.appearance().tableFooterView = UIView()
// To remove all separators including the actual ones:
UITableView.appearance().separatorStyle = .none
}
var body: some View {
List {
ForEach(messages, id: \.messageId) { message in
Group {
if(messPack.user != nil) {
ReceivedMessageView(
message: message.message,
name: message.user?.name,
color: message.user?.color)
} else {
SentMessageView(message: messPack.message)
}
}.listRowInsets(EdgeInsets())
}
}
}
}
Ficarei grato por qualquer ajuda :)
Respostas
Definir a versão mínima do iOS para iOS 13 não significa que seu código não pode ser executado no iOS 14 (e as soluções do iOS 13 para remover separadores de lista não funcionam no iOS 14).
Você precisa usar if #available(iOS 14, *)para especificar qual código usar para qual versão do iOS:
struct MessagesView: View {
var messages: [MessageModel] = []
init() {
UITableView.appearance().tableFooterView = UIView()
UITableView.appearance().separatorStyle = .none
}
var body: some View {
List {
ForEach(messages, id: \.messageId) { message in
Group {
if #available(iOS 14, *) {
messageView(for: message)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.listRowInsets(EdgeInsets())
.background(Color.white)
} else {
messageView(for: message)
}
}
}
}
}
@ViewBuilder
func messageView(for message: MessageModel) -> some View {
if messPack.user != nil {
ReceivedMessageView(
message: message.message,
name: message.user?.name,
color: message.user?.color
)
} else {
SentMessageView(message: messPack.message)
}
}
}
Removendo Listseparadores:
- iOS 13 - Como remover os separadores de linha de uma lista em SwiftUI sem usar ForEach?
- iOS 14 - Como remover linhas separadoras de lista no SwiftUI 2.0 no iOS 14
Você pode brincar com alguns dos estilos de ListView. Acho que SidebarListStyle não tem nenhuma linha. Caso contrário, você provavelmente terá que usar um ScrollView e / ou VStack em vez de uma Lista.
List {
Text("ONE")
Text("TWO")
Text("THREE")
}
.listStyle(SidebarListStyle())