2015-11-30 10 views
12

Udało mi się utworzyć NSTableView na komórkach wyłącznie w kodzie. Chciałbym, aby komórki były trochę bardziej interesujące i przeczytałem, że muszę stworzyć NSTableView oparty na widoku.Czy można utworzyć oparty na widoku NSTableView wyłącznie w kodzie?

Byłem tutoriali takich jak this.

Reszta mojego interfejsu użytkownika jest w całości w kodzie. Próbowałem zrobić to samo dla tego tableview bez szczęścia.

Oto jak ja definiowania Tableview - Muszę przestać rejestracji stalówki i nie jestem pewien, jak:

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

     tableOfTransactions.headerView = nil 

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

Oto moja kod stub dla każdej komórki:

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 
} 

Wszelkie wskazówki i sugestie, jak to osiągnąć, zostaną docenione!

+0

Co stanie się, jeśli nie zarejestrujesz Nib? – Willeke

Odpowiedz

5

Twój realizacja -tableView(_:viewForTableColumn:row:) powinien wyglądać mniej więcej tak:

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 
} 

W przypadku, gdy tabela zawiera setki wierszy, kakao będzie próbował ponownie użyć widoki, które zostały już utworzone, ale nie są już na ekranie . Pierwsza część tego fragmentu wykorzystuje metodę NSTableView do wyszukiwania takiego widoku. Jeśli nie zostanie znaleziony, musisz go utworzyć od zera.

Jeśli nie masz powodu, aby tego nie robić, jako widok użyj instancji (lub podklasy) NSTableCellView. Nie dodaje wiele do NSView, ale jedną z jego kluczowych cech jest to, że zachowuje odwołanie do modelu reprezentowanego przez widok (ustawionego przez -tableView(_:objectValueForTableColumnRow:row:)). W tym przykładzie użyłem tej funkcji, aby ustawić wartość ciągu w polu tekstowym za pomocą powiązań.

Należy również zwrócić uwagę na to, że należy podać identyfikator identyfikujący dany identyfikator z numerem NSTableColumn, w którym będzie wyświetlany widok. Dzięki temu widok tabeli będzie mógł korzystać z omówionej powyżej funkcji wielokrotnego użytku.

+0

To naprawdę pomogło w wyświetleniu komórek w debuggerze wizualnym. Czy jest szansa, że ​​możesz stworzyć zabawkowy projekt, aby pokazać pełną implementację? –

+0

Są to moje próby w projektach stub przy użyciu NIBs i próby bez: http://jmp.sh/6DdBVdP Mam działa z kodem dla widoku komórki, ale nie z kodem dla widoku tabeli. –

+1

Oto link do wersji demo: http://jmp.sh/ZY9YAWo –