0

環境:バインディングなしのビューベースの NSTableView。
問題:列のチェックボックス アクションをそのデータソースにマッピングする
(つまり、どの行でチェックボックス イベントが発生したかをリアルタイムで知る方法は?)。

IB バインディングを使用せずに、それぞれの NSTableView 行内の特定の NSButton/Checkbox アクションをデータ ソースに関連付けるにはどうすればよいですか?

ここに画像の説明を入力

チェックボックスのそれぞれのデータ配列をその UI 状態で更新できるようにしたい (チェックイン ボックス -> データ ソースの 1)。

つまり、構造体またはクロージャの配列をそれらの 1:1 テーブル エントリにマッピングします。したがって、「選択」/行をクリックすると、それぞれのブール値フラグがデータ ソース配列で更新されます。

次のコード スニペットは、UI に入力する方法を示しています。

typealias GeoTuple = (geoDesc:String,geoSelected:Int)
var geoList = [GeoTuple]()


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

    var cellView:NSTableCellView?
    let cellID = tableColumn?.identifier

    guard nil != cellID else {
        cellView = NSTableCellView()
        return cellView
    }

    cellView = (tableView.makeViewWithIdentifier(cellID!, owner: self) as? NSTableCellView)

    guard nil != cellView else {
        print("{ODYInitializePricingProductViewController} *** NO CELL VIEW GENERATED *** \n Check cell identifiers.")
        return nil
    }

    let currentTableColumn = ODYInitPricingTableColumnIdentifier(rawValue:cellView!.identifier!)

    switch currentTableColumn! {
...
   case .geoSelectFlag:
        if row < geoList.count  {
            if let selectButton = cellView?.viewWithTag(1) as? NSButton {
                selectButton.integerValue = geoList[row].geoSelected
            }
        }
  ...
  return cellView
}

質問:特定の NSButton-Check トグル イベントをトラップし、このイベントをそれぞれのデータ ソースである geoList に関連付け/マップするにはどうすればよいですか?

4

2 に答える 2

1

チェックボックス ボタンのターゲットをテーブル ビュー デリゲートに接続し、そのアクションを何らかのアクション メソッドのセレクターに設定します。

でターゲットとアクションをプログラムで設定するのがおそらく最も簡単tableView(_:viewForTableColumn:row:)です。テーブル列内のセル ビュー階層は実際にはサブ nib にあるため、それらを NIB またはストーリーボード シーンのオブジェクトに接続すると問題が発生する可能性があります。

アクション メソッドでは、テーブルを呼び出し、アクション メソッドがパラメーターとして受け取る をrowForView()渡すことで、行を検索できます。senderまた、センダーをチェックしてstate、データ モデルの新しい値をオンにするかオフにするかを決定することもできます。

于 2016-01-07T21:09:58.737 に答える
0
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { ...
...
case .geoSelectFlag:
    if row < geoList.count  {
        if let selectButton = cellView?.viewWithTag(1) as? NSButton {
            selectButton.integerValue = geoList[row].geoSelected
            selectButton.target = self
            selectButton.action = "checkBoxAction:"
        }
    }
...
}

func checkBoxAction(sender:NSButton) {

}

(lldb) po self.geoTableView.rowForView(送信者) 3

于 2016-01-07T21:59:54.577 に答える