SwiftUI - Liste: Masquer le diviseur dans iOS 13+
J'ai développé un écran de chat en utilisant SwiftUI. La version iOS minimale actuelle est 13.0.
Pour faire le chat, j'utilise l'élément List avec ForEach. Le problème est que la liste montre les diviseurs, et je dois les cacher:
J'ai essayé de cacher le style de TableView mais rien ne fonctionne. Voici le code:
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())
}
}
}
}
Je serai reconnaissant pour toute aide :)
Réponses
La définition de la version minimale d'iOS sur iOS 13 ne signifie pas que votre code ne peut pas s'exécuter sur iOS 14 (et les solutions iOS 13 pour supprimer les séparateurs de liste ne fonctionnent pas sur iOS 14).
Vous devez utiliser if #available(iOS 14, *)pour spécifier quel code utiliser pour quelle version d'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)
}
}
}
Retrait des Listséparateurs:
- iOS 13 - Comment supprimer les séparateurs de ligne d'une liste dans SwiftUI sans utiliser ForEach?
- iOS 14 - Comment supprimer les lignes de séparation de liste dans SwiftUI 2.0 sous iOS 14
Vous pouvez jouer avec certains des styles ListView. Je pense que SidebarListStyle n'a pas de lignes. Sinon, vous devrez probablement utiliser un ScrollView et / ou VStack au lieu d'une liste.
List {
Text("ONE")
Text("TWO")
Text("THREE")
}
.listStyle(SidebarListStyle())