2015-04-14 69 views
1

我有一種感覺,這個表格單元顯示問題有一個簡單的答案,但是,我顯然需要比我更大的智慧來找到它。更新的NSTableCellView.textField在表格顯示中未更新。

這裏是我的教科書控制器,委託和表和視圖封閉DataSource類...

import Cocoa 

class Table8020ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource { 

    var tokenText: [String] = ["alpha", "beta", "gamma", "delta", "epsilon", "zeta"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func numberOfRowsInTableView(aTableView: NSTableView) -> Int { 
     println("numberOfRowsInTableView = \(tokenText.count)") 
     return tokenText.count 
    } 

    func tableView(aTableView: NSTableView, objectValueForTableColumn aTableColumn: NSTableColumn?, row rowIndex: Int) -> AnyObject? { 

     var result = aTableView.makeViewWithIdentifier(aTableColumn!.identifier, owner: self) as! NSTableCellView 
      println("textField in = \(result.textField!.stringValue)") 

      result.textField!.stringValue = tokenText[rowIndex] 

      println("textField out = \(result.textField!.stringValue)") 
      return result 
    } 
} 

我登錄這似乎工作正常更新到.textField。

numberOfRowsInTableView = 6 
textField in = Table View Cell 
textField out = alpha 
textField in = Table View Cell 
textField out = beta 
textField in = Table View Cell 
textField out = gamma 
textField in = Table View Cell 
textField out = delta 
textField in = Table View Cell 
textField out = epsilon 
textField in = Table View Cell 
textField out = zeta 

但實際的表格顯示保留了原始的界面生成器值! '表格視圖單元'在'返回結果'之後似乎發生了一些神祕的事情。

我使用的是最新版本的Xcode 6.3(6D570)與雨燕V1.2

回答

5

你讓一對夫婦的錯誤。

首先,您要從tableView:objectValueForTableColumn:row返回錯誤的值。此方法未請求視圖實例,它請求視圖實例將爲的對象代表。換句話說,它想知道什麼模型對象視圖將顯示。在每種情況下,您的模型對象都非常簡單 - 它是tokenText陣列中的一個字符串。

func tableView(tableView: NSTableView, 
    objectValueForTableColumn tableColumn: NSTableColumn?, 
    row: Int) -> AnyObject? { 
     return tokenText[row] 
} 

其次,您未能執行tableView:viewForTableColumn:row:。這是您爲表格中的每個單元格創建視圖的位置,並告訴該視圖要顯示哪個模型對象的哪些位。在每一種情況下,你的模型對象只是一個字符串,所以你基本上是告訴鑑於其textField顯示整個模型對象:

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

     var view = tableView.makeViewWithIdentifier(tableColumn!.identifier, 
      owner: self) as! NSTableCellView 
     view.textField!.stringValue = tokenText[row] 

    return view 
} 
+0

感謝您的提示和明確的回覆。問題已解決。現在反思我的困惑......爲什麼是強制性重要性的「客體價值」?我認爲這可能是任何對象,就像我在這裏的「字符串」示例一樣簡單,或者像「投資組合」那樣複雜。除了保留一個指向對象的指針之外,表格還不能做任何其他事情,或者可以嗎? – Rojer

+2

在這個簡單的例子中,你不需要實現''tableView:objectValueForTableColumn:row:'' - 你可以刪除它,並且你的應用程序可以毫無問題地構建和運行。在更復雜的例子中,NSTableCellView的''objectValue''屬性更重要。我特別想到使用* bindings *填充表視圖的時候。如果你這樣做,你會發現所有的事情都可以通過* Interface Builder *來完成,而你在NSTableCellView上告訴控件的方式他們應該顯示的模型的部分是通過這個視圖的objectValue ''。 –

+0

非常好。這一切都很合理。我非常感謝你對我日益增長的智慧的貢獻。 – Rojer