es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TextView de SWIFTUI con texto añadible en tiempo real y de forma programática.

Estoy buscando una forma de crear un TextView simple (similar a la línea de comandos) que muestre al usuario lo que está sucediendo dentro de la aplicación. Debe ser capaz de añadir elementos programáticamente en tiempo real para que el usuario pueda supervisar y copiar texto desde él. Estoy escribiendo una aplicación para macOS.

Hasta ahora he hecho esto:

class OutputElementStruct: Identifiable {
    var HEX: String
    var Balance: String

    init(HEX: String, Balance: String) {
        self.HEX = HEX
        self.Balance = Balance
    }
}

class OutputElements: ObservableObject {
    @Published var OutputElement = [OutputElementStruct]()

    init() {
        self.OutputElement = [
            OutputElementStruct(HEX: "sometext", Balance: "sometext")
        ]
    }
}

Luego se muestra al usuario:

struct OutputView: View {

    @StateObject var OutputArray = OutputElements()

    var body: some View {
        GeometryReader { Geo in
            ZStack {
                BoxView(width: 600, height: 700, Name: "")

                VStack {
                    List {
                        ForEach($OutputArray.OutputElement) { item in
                            Text(verbatim: item.HEX.wrappedValue)
                        }
                    }
                }
            }
        }
        .frame(width: 600, height: 700, alignment: .center)
    }
}

Y aquí se agrega datos:

@StateObject var OutputArray = OutputElements()

.onTapGesture {
    print("button tapped")
    OutputArray.OutputElement.append(OutputElementStruct(HEX: "sometext", Balance: "sometext"))
}

Está funcionando, pero no en tiempo real. Mientras toco el botón, se imprime “button tapped” en Xcode, pero el TextView no muestra nada excepto el item añadido inicialmente en init(). ¿Cómo puedo hacer que funcione en tiempo real?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que la vista de texto agregue elementos en tiempo real, debes actualizar la vista cuando cambie el arreglo OutputElements. Una forma de hacer esto es agregar un modificador onChange a la lista y actualizar la vista cada vez que el arreglo OutputElements cambie:

    List {
        ForEach($OutputArray.OutputElement) { item in
            Text(verbatim: item.HEX.wrappedValue)
        }
    }
    .onChange(of: OutputArray.OutputElement) { _ in
        // Actualiza la vista cuando cambie OutputArray
    }
    

    Además, debes actualizar el arreglo OutputElements en la cola principal para asegurar que las actualizaciones se realicen en el hilo principal:

    DispatchQueue.main.async {
        OutputArray.OutputElement.append(OutputElementStruct(HEX: "algún texto", Balance: "algún texto"))
    }
    

    Con estos cambios, la vista de texto debería actualizarse en tiempo real a medida que se agregan elementos al arreglo OutputElements.

Comments are closed.