SwiftUI - Lista: Ocultar divisor en iOS 13+

Nov 08 2020

Desarrollé una pantalla de chat usando SwiftUI. La versión mínima actual de iOS es 13.0.

Para hacer el chat, uso el elemento List con ForEach. El problema es que la lista muestra los divisores y necesito ocultarlos:

Traté de ocultar el estilo de TableView pero nada funciona. Aquí está el 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())
            }
        }
    }
}

Estaré agradecido por cualquier ayuda :)

Respuestas

1 pawello2222 Nov 08 2020 at 22:46

Establecer la versión mínima de iOS en iOS 13 no significa que su código no se pueda ejecutar en iOS 14 (y las soluciones de iOS 13 para eliminar los separadores de listas no funcionan en iOS 14).

Debe usar if #available(iOS 14, *)para especificar qué código se usa para qué versión de 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)
        }
    }
}

Eliminación de Listseparadores:

  • iOS 13 - ¿Cómo eliminar los separadores de línea de una lista en SwiftUI sin usar ForEach?
  • iOS 14 - Cómo eliminar las líneas del separador de listas en SwiftUI 2.0 en iOS 14
nicksarno Nov 08 2020 at 04:12

Puede jugar con algunos de los estilos de ListView. Creo que SidebarListStyle no tiene líneas. De lo contrario, probablemente tendrá que usar ScrollView y / o VStack en lugar de List.

    List {
        Text("ONE")
        Text("TWO")
        Text("THREE")
    }
    .listStyle(SidebarListStyle())