2017-01-05 3 views
2

単純なビューベースのNSTableViewを作成できますが、識別子についてはわかりません。あなたは、通常の列に識別子を与え、その後、デリゲートメソッドを実装NSTableViewで テーブルセルビューのNSTableView識別子が混乱しています

:あなたが必要なものをあなたがする列に切り替え、その後

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? 

とを、何かのように:

switch tableColumn!.identifier { 
case "firstColumn": 
    //do something... 
case "secondColumn": 
    //do something else... 
default: 
    return nil 
} 

さらに、各セルに識別子も入力することができます。上記の例では、私は列に識別子を与えず、代わりに識別子をテーブルセルビュー自体に与えました

私は、私は、デリゲートメソッドでは、このような何かを行うことができると推測さ:

if let firstColumnCellView = tableView.make(withIdentifier: "firstColumnCell", owner: self) as? NSTableCellView { 
    view.textField?.stringValue = "Hi! I'm in the first column" 
    return view 
} else if let secondColumnCellView = tableView.make(withIdentifier: "secondColumnCell", owner: self) as? NSTableCellView { 
    view.textField?.stringValue = "Hi! I'm in the second column" 
    return view 
} else { 
    return nil 
} 

これは動作しますが、最初のif letの文を過ぎてそれを作ることはありません、ので、私のすべてのセルがこんにちは、私は「」と言います!私は理解していない他の

何か:それは表のセルのVと思われる最初の列」


詳細におけるメートルビュー識別子は識別子をカラムに置き換えます。

私は、文書のアウトラインに行くと識別子にこのような何か割り当てた場合:

tableColumn: "firstColumn" 
    tableViewCell: "firstColumnCell" 

tableColumn: "secondColumn" 
    tableViewCell: "secondColumnCell" 

、その後供給列識別子とセル識別子の両方を、それが動作!

switch tableColumn!.identifier { 
    case "firstColumn": 
     if let firstColumnCellView = tableView.make(withIdentifier: "firstColumnCell", owner: self) as? NSTableCellView { 
      view.textField?.stringValue = "Hi! I'm in the first column" 
      return view 
     } else { 
      return nil 
     } 
    case "secondColumn": 
     if let secondColumnCellView = tableView.make(withIdentifier: "secondColumnCell", owner: self) as? NSTableCellView { 
      view.textField?.stringValue = "Hi! I'm in the second column" 
      return view 
     } else { 
      return nil 
     } 
    default: 
     return nil 
    } 

しかし、それクラッシュ私は、switch文は、第二カラムためのセル識別子を無視して、列の識別子を使用しようとして落下することができます。

switch tableColumn!.identifier { 
    case "firstColumn": 
     if let firstColumnCellView = tableView.make(withIdentifier: "firstColumnCell", owner: self) as? NSTableCellView { 
      view.textField?.stringValue = "Hi! I'm in the first column" 
      return view 
     } else { 
      return nil 
     } 
    default: 
     break 
    } 


    let cellView = tableView.make(withIdentifier: tableColumn!.identifier, owner: self) as! NSTableCellView 
    cellView.textField?.stringValue = "hello" 
    return cellView 

    //CRASH: Unexpectedly found nil when unwrapping tableColumn!.identifier 
    // The column both exists and has an identifier of "secondColumn", so how could 
    //this be nil? 

そして、私がsecondColumnと同じ名前にsecondColumnCellの名前を変更することにより、このオーバーライド動作を確認することができそうです:

tableColumn: "firstColumn" 
    tableViewCell: "firstColumnCell" 

tableColumn: "secondColumn" <--- Same Name 
    tableViewCell: "secondColumn" <-- Same Name 

そして今、コードが期待通りに動作し、クラッシュしません。

答えて

0

私が正しくコードのあなたの最後のチャンクを読めば、あなたはインスタンス化(または使用-ビュー-NO-もはやオンスクリーンプールから取り出す - hereを参照してください)識別子firstColumnCellとビュー。

識別子が有効な場合(ビューを定義するペン先がある場合)、メソッドは常にゼロ以外のビューを返しますので、最初のif let ...は常に成功します。

したがって、view.textField?.stringValue = "Hi! I'm in the first column"が実行され、メッセージがセルに表示され、NSTableViewで使用されるビューが返され、メソッドが終了します。

次のif let ...ステートメントは決して実行することができません。

+0

ありがとうございます。私は質問に追加情報を追加しました。申し訳ありませんまだ私は理解していません。 – MH175

関連する問題