从NSTableView中删除行并添加新行不起作用

时间:2016-04-10 12:27:44

标签: swift cocoa view nstableview nsview

我正在尝试从NSTableView中删除一行。

当我从包含tableview数据的数组中删除数据并重新加载tableview时程序可以正常工作。

但是当我在数组上添加一个新行并重新加载tableview时,我的程序崩溃了,说明了

中的cell.view(我制作的自定义cellview)
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?

nil,但我不会从tableview中删除我的观点!

这是一个常见错误吗?我没有使用绑定。

怎么可能发生这种情况?

我正在调试此代码:

 import Cocoa

 class GraficsBalancGlobalViewController: NSViewController, GraficViewDataSource, NSTableViewDelegate, NSTableViewDataSource {

// MARK: - Inicialització de view

override func viewDidLoad() {
    super.viewDidLoad()

    tableViewGrafics.setDelegate(self)
    tableViewGrafics.setDataSource(self)

    // Aixo esta alerta per si s'envia una ordre de graficar
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GraficsBalancGlobalViewController.afegeixUnGraficPerNotificacio(_:)), name: "AfegeixGrafic", object: nil)

}

// MARK: - Variables Taula

var taula = TaulaMesosClass.sharedTaula.taulaColumnes

var infoTaulaGrafics = [(GraficView, Int, [Double])]()

@IBOutlet weak var tableViewGrafics: NSTableView!

// MARK: - Datasource

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    if (tableView.identifier == "TaulaGrafics") {
        print("Num rows = \(infoTaulaGrafics.count)")
        return infoTaulaGrafics.count
        //return taulaGrafics.count
    } else {
        return 0
    }

}

// MARK: - Delegate

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


    if tableColumn == tableView.tableColumns[0] {

        cellIdentifier = "GraficCellID"

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

            let (grafic, columna, array) = infoTaulaGrafics[row]
            print("la row:\(row)")
            if cell.graficView == nil{ // It is something that "hides the mistake, but doesn't work as expected, the loded view in the row 0 is the last added! no sense at all...
//                    if row == 0{
//                        return nil
//                    }else {
                print("fem una nova ************")
//                    let frame = NSRect(x: 0, y: 0, width: tableViewGrafics.bounds.width , height: tableViewGrafics.bounds.width * 0.50)
//                    let nouGrafic = GraficView(frame: frame)
                cell.identifier = cellIdentifier
                cell.graficView = grafic
                cell.graficView.quinaRow = row
                print("la row quinaRow:\(cell.graficView.quinaRow)")
                cell.graficView.dataSource = self
                cell.graficView.quinaRow = row
                cell.graficView = grafic
                print("array \(array)")
                print("columna \(columna)")
                print("es fa el data source")

                //}

            }else{
                cell.identifier = cellIdentifier
                //print("la row quinaRowAbans:\(cell.graficView.quinaRow)")
                cell.graficView.quinaRow = row
                print("la row quinaRowDespres:\(cell.graficView.quinaRow)")
                cell.graficView.dataSource = self
                cell.graficView = grafic
                print("array \(array)")
                print("columna \(columna)")
                print("es fa el data source")
            }
            return cell
        }
    }
    return nil
}

// MARK: - reloadData

func reloadTaula() {
    tableViewGrafics.reloadData()
}

// MARK: - preparaArray

func preparaArray(columna: Int) -> [Double]{
    var array = [Double]()
    for i in 0..<(taula[columna].filesConsum!.count - 1) {
        let valor = taula[columna].filesConsum![i]!
        array.append(valor)
    }
    return array
}


// MARK: - afegeixUnGraficPerNotificacio i afegeix un grafic

func afegeixUnGraficPerNotificacio (notificacio: NSNotification){
    print("Afegire Un Grafic")
    if let columna = notificacio.object as? Int {
        print("La columna passada:\(columna)")

        // Apanyo per passar-ho a [Double] enlloc de [Double?]
        let array = preparaArray(columna)
        //arrayY
        addNewGrafic(columna, array: array)
    }

}

func addNewGrafic(columna: Int, array: [Double]) {

    let frame = NSRect(x: 0, y: 0, width: tableViewGrafics.bounds.width , height: tableViewGrafics.bounds.width * 0.50)
    let nouGrafic = GraficView(frame: frame)
    nouGrafic.quinaRow = infoTaulaGrafics.count // afegim la view al final
//        nouGrafic.dataSource = self

    infoTaulaGrafics.append((nouGrafic, columna, array))
    reloadTaula()
    print(infoTaulaGrafics)
    print("Pintem la row passada \(nouGrafic.quinaRow)")
    //viewDelScrollview.addSubview(nouGrafic)
    print ("Guardat un Nou Grafic!")
}

// MARK: - Protocol del GraficView infoGraficsView
// Passa el array corresponent per graficar

func infoGraficsView(sender: GraficView) -> [Double]? {
    print("la row entrada per a graficar:\(sender.quinaRow)")
    let (_, _, array) = infoTaulaGrafics[sender.quinaRow]
    return array
}

// MARK: - Eliminar Grafics

@IBAction func eliminaGrafic(sender: NSButton) {
    let selectedRow = tableViewGrafics.selectedRow
    if selectedRow != -1 {
        print("columna seleccionada per eliminar = \(selectedRow)")

        //let (grafic,_,_) = infoTaulaGrafics[selectedRow]
        //grafic.removeFromSuperview()

        infoTaulaGrafics.removeAtIndex(selectedRow)
        tableViewGrafics.removeRowsAtIndexes(NSIndexSet(index: selectedRow), withAnimation: .EffectNone)
//            for i in selectedRow..<infoTaulaGrafics.count {
//                let (grafic2,_,_) = infoTaulaGrafics[i]
//                tableViewGrafics.
//                print("Fila norenombrada: \(grafic2.quinaRow)")
//                grafic2.quinaRow = grafic2.quinaRow - 1 // hem eliminat 1 columna i per tant s'ha d'ajustar
//                print("Fila renombrada: \(grafic2.quinaRow)")
//            }

        print("Pinto despres d'eliminar\(infoTaulaGrafics)")
    } else {
        if infoTaulaGrafics.count > 0 {

            //tableViewGrafics.removeRowsAtIndexes(NSIndexSet(index: infoTaulaGrafics.count-1), withAnimation: .EffectNone)
            let (grafic,_,_) = infoTaulaGrafics[infoTaulaGrafics.count-1]
            grafic.removeFromSuperview()
            infoTaulaGrafics.removeLast()

            print("Pinto despres d'eliminar l'ultim\(infoTaulaGrafics)")
        }

    }
    tableViewGrafics.reloadData()
    reloadTaula()

}

func tableViewSelectionDidChange(notification: NSNotification) {
    let selectedRow = tableViewGrafics.selectedRow
    print("A veure que selecciona: \(selectedRow)")
}

}

0 个答案:

没有答案