我正在尝试从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)")
}
}