Domanda

Voglio dinamicamente nascondi/mostra alcune delle colonne in un NSTableView, in base ai dati che sta per essere visualizzato in pratica, se una colonna è vuota vorrei che la colonna sia nascosto.Sto attualmente popolano il tavolo con un controller di classe come il delegato per la tabella.

Tutte le idee?Ho visto che posso impostare la colonna nascosta in Interface Builder, tuttavia non sembra essere un buon momento per passare attraverso le colonne e controllare se sono vuote o non, dal momento che non sembra essere un metodo che viene chiamato prima/dopo che tutti i dati nella tabella viene popolata.

È stato utile?

Soluzione

Un NSTable è solo la classe che dipinge il tavolo.Come hai detto te, hai un po ' di classe è la tabella, come delegato, e questa classe, che alimenta la tabella con i dati da visualizzare.Se si memorizzano i dati della tabella come NSArray entro il delegato di classe, dovrebbe essere facile da trovare se una colonna è vuota, non è vero?E NSArray chiede la vostra classe, tramite il metodo delegato quante colonne ci sono, così, quando si è chiesto: perché non cerca di quante colonne si dispone di dati e report quel numero invece del reale numero di colonne di memorizzare al loro interno e quindi quando viene richiesto di fornire i dati per (colonna,riga), solo saltare la colonna vuota.

Altri suggerimenti

In Mac OS X v10.5 e versioni successive, c'è il setHidden: selettore per NSTableColumn.

Questo permette, in modo dinamico mostrate / nascoste con l'uso di identificatori:

NSInteger colIdx;
NSTableColumn* col;

colIdx = [myTable columnWithIdentifier:@"columnIdent"];
col = [myTable.tableColumns objectAtIndex:colIdx];
[col setHidden:YES];

Questo l'ho fatto io con associazioni, ma la loro definizione a livello di programmazione, anziché tramite Interface Builder.

Questo psuedo-frammento dovrebbe dare il senso di tutto ciò:

NSTableColumn *aColumn = [[NSTableColumn alloc] initWithIdentifier:attr];
[aColumn setWidth:DEFAULTCOLWIDTH];
[aColumn setMinWidth:MINCOLWIDTH];
[[aColumn headerCell] setStringValue:columnLabel];

[aColumn bind:@"value"
     toObject:arrayController 
  withKeyPath:keyPath 
  options:nil];             

[tableView addTableColumn:aColumn];
[aColumn release];

Naturalmente, è possibile aggiungere formattatori e tutto il resto anche.

Non funziona in Interface Builder.Tuttavia funziona a livello di programmazione.Ecco come associare un NSTableViewColumn con l'identificatore "Status" di una chiave nella mia NSUserDefaults:

Swift:

tableView.tableColumnWithIdentifier("Status")?.bind("hidden", toObject: NSUserDefaults.standardUserDefaults(), withKeyPath: "TableColumnStatus", options: nil)

Objective-C:

[[self.tableView tableColumnWithIdentifier:@"Status"] bind:@"hidden" toObject:[NSUserDefaults standardUserDefaults] withKeyPath:@"TableColumnStatus" options:nil];

Non ho una risposta completa in questo momento, ma guardare in Associazioni.È generalmente possibile fare ogni sorta di cose con Cacao Associazioni.

Non c'è Visibilità vincolante per NSTableColumn, ma si può essere in grado di impostare la larghezza a 0.

Quindi è possibile associare, Null Segnaposto, e impostare questo valore a 0 ma non dimenticare di impostare gli altri Segnaposto a valori ragionevoli.

(Come ho detto, questo è solo l'inizio, potreste aver bisogno di qualche ritocco).

Non c'è una volta che tutti i dati vengono inseriti.NSTableView non memorizza i dati in modo dinamico chiede dalla sua origine dati (o destinata ad oggetti, se si utilizza associazioni).Solo pareggi utilizzando dati ricavati dai dati di origine e di fossi di esso.Non si deve vedere la tabella di chiedere i dati per tutto ciò che non è visibile, per esempio.

Sembra che tu stia utilizzando un datasource?Quando i dati vengono modificati, è vostra responsabilità di chiamata -reloadData sul tavolo, che è un po ' un termine improprio.E 'più simile ad invalidare il tutto'.

Che è, si dovrebbe già sapere quando i dati cambiano.Questo è il punto in cui è possibile calcolare le colonne devono essere nascoste.

@amrox - Se sto capendo il tuo suggerimento correttamente, stai dicendo che dovrei associare un valore per la proprietà hidden della NSTableColumns nella mia tabella?Che sembra come avrebbe funzionato, tuttavia non credo che NSTableColumn ha una proprietà nascosta, poiché il isHidden e setHidden messaggi di controllare la visibilità della colonna che mi dice che questa non è una proprietà, a meno che non mi sto perdendo qualcosa (che è del tutto possibile).

Vorrei postare la mia soluzione aggiornato per Swift 4 utilizzando il Cacao, le associazioni e le effettive isHidden bandiera senza toccare la larghezza delle colonne (come potrebbe essere necessario ripristinare il valore originale dopo...).Supponiamo di avere una Casella di controllo per attivare qualche colonna di visibilità (o si può sempre passare il hideColumnsFlag variabile nell'esempio sotto in qualsiasi altro modo si voglia):

class ViewController: NSViewController {

     // define the boolean binding variable to hide the columns and use its name as keypath
     @objc dynamic var hideColumnsFlag = true

     // Referring the column(s)
     // Method 1: creating IBOutlet(s) for the column(s): just ctrl-drag each column here to add it
     @IBOutlet weak var hideableTableColumn: NSTableColumn!
     // add as many column outlets as you need...

     // or, if you prefer working with columns' string keypaths
     // Method 2: use just the table view IBOutlet and its column identifiers (you **must** anyway set the latter identifiers manually via IB for each column)
     @IBOutlet weak var theTableView: NSTableView! // this line could be actually removed if using the first method on this example, but in a real case, you will probably need it anyway.

     // MARK: View Controller Lifecycle

     override func viewDidLoad() {
         super.viewDidLoad()

         // Method 1
         // referring the columns by using the outlets as such:
         hideableTableColumn.bind(.hidden, to: self, withKeyPath: "hideColumnsFlag", options: nil)
         // repeat for each column outlet.

         // Method 2
         // or if you need/prefer to use the column identifiers strings then:
         // theTableView.tableColumn(withIdentifier: .init("columnName"))?.bind(.hidden, to: self, withKeyPath: "hideColumnsFlag", options: nil)
         // repeat for each column identifier you have set.

         // obviously use just one method by commenting/uncommenting one or the other.
     }

     // MARK: Actions

     // this is the checkBox action method, just toggling the boolean variable bound to the columns in the viewDidLoad method.
     @IBAction func hideColumnsCheckboxAction(_ sender: NSButton) {
         hideColumnsFlag = sender.state == .on
     }
}

Come avrete notato, non esiste ancora un modo per associare il Hidden bandiera in Interface Builder come XCode10:si può vedere il Enabled o Editable associazioni, ma solo a livello di programmazione, si avrà accesso al isHidden bandiera per la colonna, come viene chiamato in Swift.

Come indicato nei commenti, il secondo metodo si basa sulla colonna identificatori è necessario impostare manualmente sia tramite Interface Builder sul campo di Identità dopo aver selezionato le colonne interessate o, se si dispone di un array di nomi di colonna, è possibile enumerare le colonne della tabella e assegnare gli identificativi nonché le associazioni, invece di ripetere simili linee di codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top