SwiftUI - Lista: Ukryj separator w iOS 13+

Nov 08 2020

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

1 pawello2222 Nov 08 2020 at 22:46

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
nicksarno Nov 08 2020 at 04:12

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())