SwiftUI - Lista: Ukryj separator w iOS 13+
Stworzyłem ekran czatu przy użyciu SwiftUI. Obecna minimalna wersja iOS to 13.0.
Do rozmowy używam elementu List z ForEach. Problem w tym, że lista pokazuje dzielniki i muszę je ukryć:
Próbowałem ukryć styl TableView, ale nic nie działa. Oto kod:
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())
}
}
}
}
Będę wdzięczny za pomoc :)
Odpowiedzi
Ustawienie minimalnej wersji iOS na iOS 13 nie oznacza, że kod nie może działać na iOS 14 (i rozwiązania iOS 13 do usuwania separatorów list nie działają w iOS 14).
Musisz użyć, if #available(iOS 14, *)aby określić, który kod ma być używany dla której wersji 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)
}
}
}
Usuwanie Listseparatorów:
- iOS 13 - Jak usunąć separatory linii z listy w SwiftUI bez korzystania z ForEach?
- iOS 14 - Jak usunąć linie separatora listy w SwiftUI 2.0 w iOS 14
Możesz bawić się niektórymi stylami ListView. Myślę, że SidebarListStyle nie ma żadnych linii. W przeciwnym razie prawdopodobnie będziesz musiał użyć ScrollView i / lub VStack zamiast listy.
List {
Text("ONE")
Text("TWO")
Text("THREE")
}
.listStyle(SidebarListStyle())