• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

252
Views
NSTableView basado en vista que no aplica recargas parciales con DifferenceKit

Estoy usando un NSTableView y DifferenceKit. Todo esto es programático, sin Interface Builder en absoluto.

Anteriormente implementé solo tableView(_:objectValueFor:row) para obtener valores en mi tabla. En ese momento pude aplicar recargas completas y parciales y todo funcionó bien.

Ahora agregué una implementación de tableView(_:viewFor:row:) para formatear algunas columnas de manera diferente, y se ve afectada la recarga. Un reloadData() completo aún funciona, pero una llamada a reloadData(forRowIndexes:columnIndexes) no llama ni a mi fuente de datos ni a los métodos delegados; la recarga parece simplemente desaparecer.

También intenté eliminar el método de fuente de datos y ejecutar solo con tableView(_:viewFor:row:) pero sin dados. Una recarga parcial todavía no llama al método de delegado.

¿Se ha topado alguien con esto? ¿Hay algún matiz de NSTableView que me estoy perdiendo?

Mi código (truncado):

 init() { ... tableView.dataSource = self tableView.delegate = self columns.forEach { tableView.addTableColumn($0) } } func tableView( _ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int ) -> Any? { ... return someStringProvider(column, row) } func tableView( _ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int ) -> NSView? { ... if let existingView = tableView.makeView(withIdentifier: identifier, owner: self) as? NSTableCellView { existingView.textField?.stringValue = someStringProvider(column, row) return existingView } let textField = NSTextField() ... textField.stringValue = someStringProvider(column, row) let view = NSTableCellView() view.identifier = identifier view.addSubview(textField) view.textField = textField view.addConstraints([ ... (pin textField to view) ]) textField.bind( .value, to: view, withKeyPath: "objectValue", options: nil ) return view }
over 3 years ago · Santiago Trujillo
1 answers
Answer question

0

Esto resulta ser un malentendido, o posiblemente un error, en la forma en que DifferenceKit interactúa con un NSTableView basado en vistas, en lugar de en celdas.

De manera crucial, no estaba verificando los valores con los que se llamó a reloadData(forRowIndexes:columnIndexes) , y los índices de columna pasados por el algoritmo de DifferenceKit siempre fueron [0] , que no era válido para ninguna celda visible ya que mi primera columna está oculta, por lo que los métodos no fueron no ha llamado

La lección útil aquí es que cuando el delegado de una vista de tabla carece de tableView(_:viewFor:row:) , una recarga en cualquier columna recarga la fila completa, pero una vez que se especifican las vistas, los valores de la columna se vuelven relevantes.

over 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error