2015-11-30 10 views
12

Ho creato con successo un NSTableView basato su cella puramente nel codice. Mi piacerebbe rendere le celle un po 'più interessanti e ho letto che ho bisogno di creare un NSTableView basato sulla vista.È possibile creare un NSTableView basato su vista puramente nel codice?

Sono stato tutorials come this.

Il resto dell'interfaccia utente è interamente in codice. Ho cercato di fare lo stesso per questa tabella senza molta fortuna.

Ecco come sto definendo la TableView - ho bisogno di fermare la registrazione del pennino e io non sono sicuro di come:

 let nib = NSNib(nibNamed: "TransactionCellView", bundle: NSBundle.mainBundle()) 
     tableOfTransactions.registerNib(nib!, forIdentifier: "TransactionCellView") 

     tableOfTransactions.headerView = nil 

     tableOfTransactions.setDelegate(self) 
     tableOfTransactions.setDataSource(self) 
     tableOfTransactions.reloadData() 

Ecco il mio codice stub per ogni cella:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?{ 
     var testCell = NSView() 
     testCell.frame = NSRect(x: 0, y: 0, width: 300, height: 200) 
     return testCell 
} 

Qualsiasi suggerimento o suggerimento su come ottenere questo risultato sarebbe molto apprezzato!

+0

Cosa succede se non si effettua registerNib? – Willeke

risposta

5

L'implementazione di -tableView(_:viewForTableColumn:row:) dovrebbe essere simile a questa:

func tableView(tableView: NSTableView, 
    viewForTableColumn 
    tableColumn: NSTableColumn?, 
    row: Int) -> NSView? { 

     var retval: NSView? 
     if let spareView = tableView.makeViewWithIdentifier("CodeCreatedTableCellView", 
      owner: self) as? NSTableCellView { 

      // We can use an old cell - no need to do anything. 
      retval = spareView 

     } else { 

      // Create a text field for the cell 
      let textField = NSTextField() 
      textField.backgroundColor = NSColor.clearColor() 
      textField.translatesAutoresizingMaskIntoConstraints = false 
      textField.bordered = false 
      textField.controlSize = NSControlSize.SmallControlSize 

      // Create a cell 
      let newCell = NSTableCellView() 
      newCell.identifier = "CodeCreatedTableCellView" 
      newCell.addSubview(textField) 
      newCell.textField = textField 

      // Constrain the text field within the cell 
      newCell.addConstraints(
       NSLayoutConstraint.constraintsWithVisualFormat("H:|[textField]|", 
        options: [], 
        metrics: nil, 
        views: ["textField" : textField])) 

      newCell.addConstraints(
       NSLayoutConstraint.constraintsWithVisualFormat("V:|[textField]|", 
        options: [], 
        metrics: nil, 
        views: ["textField" : textField])) 

      textField.bind(NSValueBinding, 
       toObject: newCell, 
       withKeyPath: "objectValue", 
       options: nil) 

      retval = newCell 
     } 

     return retval 
} 

Nel caso in cui la tabella contiene centinaia di righe, cacao tenterà di riutilizzare le viste che sono già stati creati, ma non sono più sullo schermo . La prima parte di questo frammento utilizza un metodo NSTableView per cercare tale visualizzazione. Se nessuno viene trovato, è necessario crearne uno da zero.

Se non si ha motivo di non farlo, si dovrebbe utilizzare un'istanza (o sottoclasse) di NSTableCellView come vista. Non aggiunge molto a NSView, ma una delle sue caratteristiche principali è che conserva un riferimento al modello rappresentato dalla vista (impostato da -tableView(_:objectValueForTableColumnRow:row:)). In questo esempio ho usato questa funzione per impostare il valore di stringa del campo di testo usando i bind.

L'altra cosa da notare è che si dovrebbe fornire alla vista un identificatore che corrisponda all'identificatore che è stato assegnato allo NSTableColumn in cui si troverà la vista. Ciò consente alla visualizzazione tabella di utilizzare la funzione di visualizzazione riutilizzabile discussa sopra.

+0

Ciò ha davvero aiutato a far comparire le celle nel debugger visivo. C'è qualche possibilità che tu possa creare un progetto giocattolo per mostrare la piena implementazione? –

+0

Questi sono i miei tentativi nei progetti di stub utilizzando NIB e cercando senza: http://jmp.sh/6DdBVdP Ho funzionato con codice per la visualizzazione cella ma non con codice per la vista tabella. –

+1

Ecco un link alla demo: http://jmp.sh/ZY9YAWo –