1

カスタム NSTableCellView で NSTableview を作成するさまざまな方法を試しましたが、うまくいきませんでした。問題は、どうすればそれを行うことができるかということです。

最後に試したのは次のとおりです。

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

    var cellIdentifier: String = ""


    if tableColumn == tableView.tableColumns[0] {

        cellIdentifier = "CellID"

        if let cell = tableView.makeViewWithIdentifier(cellIdentifier, owner: self ) as? MyTableCellView {

            cell.identifier = cellIdentifier
            // array is an array that contains NSView with layers with different colors
            cell.myView = array[row]
            return cell
        }
    }
    return nil
}

ここに画像の説明を入力

ラベルを追加した後:

ここに画像の説明を入力

そして完全なコード:

クラスViewController:NSViewController、NSTableViewDelegate、NSTableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
    tableview.setDelegate(self)
    tableview.setDataSource(self)

    let view = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
    view.layer?.backgroundColor = NSColor.blueColor().CGColor
    array.append(view)
    let view2 = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
    view2.layer?.backgroundColor = NSColor.greenColor().CGColor
    array.append(view2)

    array2label.append("bu")
    array2label.append("buu")

    tableview.reloadData()

    // Do any additional setup after loading the view.
}

override func viewWillAppear() {


    //tableview.reloadData()

    laView.layer?.backgroundColor = NSColor.greenColor().CGColor
}
@IBOutlet weak var laView: NSView!

@IBOutlet weak var tableview: NSTableView!

var array = [NSView]()
var array2label = [String]()// = ["bu","buu"]

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    if (tableView.identifier == "Taula") {

        return array.count
        //return taulaGrafics.count
    } else {
        return 0
    }

}

@IBOutlet weak var viewDeProva: NSView!

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    print ( "Preparem la TableView" )
    var cellIdentifier: String = ""


    if tableColumn == tableView.tableColumns[0] {

        cellIdentifier = "CellID"

        if let cell = tableView.makeViewWithIdentifier(cellIdentifier, owner: self ) as? MyTableCellView {
            print ( "aqui" )
            print(array)
            print(array2label)

            cell.identifier = cellIdentifier
            cell.myView = array[row]
            cell.label.stringValue = array2label[row]

            return cell
        }
    }
    return nil
}

@IBAction func afegir(sender: NSButton) {
    let view = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
    view.layer?.backgroundColor = NSColor.yellowColor().CGColor
    array.append(view)
    array2label.append("buLabel")
    tableview.reloadData()
}
@IBAction func treure(sender: NSButton) {
    array.removeLast()
    tableview.reloadData()
}
}

ここに画像の説明を入力

 if let cell = tableView.makeViewWithIdentifier(cellIdentifier, owner: self ) as? MyTableCellView {
            print ( "aqui" )
            print(array)
            print(array2label)

            cell.identifier = cellIdentifier
            cell.myView = array[row]
            cell.myView.wantsLayer = true
            cell.label.stringValue = array2label[row]

            return cell
        }
4

1 に答える 1

0

この変更により、ビューは次のようになると予想される色を示します。

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
    print("DidLoad")
    tableview.setDelegate(self)
    tableview.setDataSource(self)
}

override func viewWillAppear() {
    print("WillAppear")
    array.append(NSColor.blueColor().CGColor)
    array2label.append("buIni")
    tableview.reloadData()
    laView.layer?.backgroundColor = NSColor.greenColor().CGColor
}

@IBOutlet weak var laView: NSView!

@IBOutlet weak var tableview: NSTableView!

var array = [CGColor]()
var array2label = [String]()

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    if (tableView.identifier == "Taula") {

        return array.count
        //return taulaGrafics.count
    } else {
        return 0
    }

}

@IBOutlet weak var viewDeProva: NSView!

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    print ( "Preparem la TableView" )
    var cellIdentifier: String = ""


    if tableColumn == tableView.tableColumns[0] {

        cellIdentifier = "CellID"

        if let cell = tableView.makeViewWithIdentifier(cellIdentifier, owner: self ) as? MyTableCellView {
            print ( "Here" )
            print(array)
            print(array2label)
            cell.identifier = cellIdentifier
            cell.myView.layer?.backgroundColor = array[row]
            cell.label.stringValue = array2label[row]

            return cell
        }
    }
    return nil
}

@IBAction func afegir(sender: NSButton) {
    let color = NSColor.yellowColor().CGColor
    array.append(color)
    array2label.append("buLabel")
    tableview.reloadData()
}
@IBAction func treure(sender: NSButton) {
    array.removeLast()
    array2label.removeLast()
    tableview.reloadData()
}
}

問題は、NSTableViewCell 内の NSView を別のビューに置き換えることができないことでした。これは、プロトタイプ セルを変更しているためです。したがって、ビューを置き換えると、NSTableViewCell はその NewView レイヤーを認識しません (理由は 100% わかりません)。一部の情報が共有されているようです。

では、テーブルビュー セルに情報を渡すにはどうすればよいでしょうか。そこにレイヤーを表示するにはどうすればよいですか?? 答えはNSTableCellView、インターフェイス ビルダーまたはそのサブクラスに追加されたプロトタイプ セルを変更するだけです (私の場合と同様に、以下のセルを参照してください)。関数内のコンテンツを変更しますが、NSView! は変更しませんviewForTableColumn。次のコードを参照してください。

if let cell = tableView.makeViewWithIdentifier(cellIdentifier, owner: self ) as? MyTableCellView {

            cell.identifier = cellIdentifier // that is to identify the cell
            cell.myView.layer?.backgroundColor = array[row] // see that the array contains CGCOLORS not NSViews
            // The program was not showing the colors because the
            // view copied doesn't copy its layer, or at least
            // doesn't show it.
            // Even though, if you say: *******---This is incorrect:
            cell.myView = arrayOfNSViews[row] //the program will
            // crash when removing 2 rows, myView = nil !!!!. 
            // That is because when you remove the item of the array
            // somehow you are removing myView too, because it make a
            // copy or a reference to it (Not sure what exactly).
            // Here continues the correct program: ******---

            cell.label.stringValue = array2label[row]

            return cell
}

また、textField の場合: を参照してください。cell.label.stringValue = array2label[row]全体ではなく、テキストフィールドの文字列値を変更しますNSTextfield

だから皆さん、私の言葉を思い出して繰り返してください。私はそれを見つけるのに4日を費やしています...

約束された NStableCellView は次のとおりです。

class MyTableCellView: NSTableCellView {

   @IBOutlet weak var myView: NSView!

   @IBOutlet weak var label: NSTextField!

}

ビュー階層の 1 つのイメージ:

ここに画像の説明を入力

于 2016-04-13T21:21:57.963 に答える