为什么Swift中的这段代码在NSTableView上产生一个空行?

时间:2014-06-07 00:37:47

标签: cocoa swift

我(很明显)是Swift的新手,而且我对Cocoa编程一般都很陌生。当我构建这个代码并运行它时,它会自动在NSTableView上为peopleList [0]插入一个空行,所以当我去添加一个新人时,它们会显示在第二行,而第一行仍为空。我不知道为什么会这样。我知道我可以在插入第一行数据之前以编程方式删除空行,但如果可能的话,我想知道这个的根本原因。

这是我的代码:

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate, NSTableViewDataSource,     NSTableViewDelegate {

    @IBOutlet var window: NSWindow

    // Table View Outlet
    @IBOutlet var tableViewData : NSTableView

    // Text Field Cell Outlets
    @IBOutlet var firstNameTextField : NSTextField
    @IBOutlet var lastNameTextField : NSTextField
    @IBOutlet var ageTextField : NSTextField
    @IBOutlet var netWorthTextField : NSTextField


    // declare an array of multiple dictionaries
    var peopleList = [Dictionary <String, String>()]


    func applicationDidFinishLaunching(aNotification: NSNotification?) {
        // Insert code here to initialize your application

    }

    func applicationWillTerminate(aNotification: NSNotification?) {
        // Insert code here to tear down your application
    }

    func numberOfRowsInTableView(aTableView: NSTableView!) -> Int
    {
        let numberOfRows:Int = getDataArray().count
        return numberOfRows
    }

    func tableView(tableView: NSTableView!, objectValueForTableColumn tableColumn: NSTableColumn!, row: Int) -> AnyObject!
    {

        var newString = getDataArray().objectAtIndex(row).objectForKey(tableColumn.identifier)
        return newString;
    }


    func getDataArray() -> NSArray {
        return peopleList
    }

    // When button is hit, add NSTextField values to array and refresh the tableview
    @IBAction func addFieldDataToArray(sender : AnyObject) {
        peopleList.append(["FirstName": firstNameTextField.stringValue, "LastName": lastNameTextField.stringValue, "Age": ageTextField.stringValue, "NetWorth": netWorthTextField.stringValue])
        println(peopleList)
        tableViewData.reloadData()
    }

}

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您正在初始化并附加到peopleList。初始化时,peopleListDictionary<String, String>的数组,包含一个空字典:

> var peopleList = [Dictionary <String, String>()]
[[String : String]] = 1 value {
  [0] = {}
}

添加一个人后,它看起来像这样 - 你已经附加了一个新人的信息,但那个空的初始字典仍在那里。

[[String : String]] = 2 values {
  [0] = {}
  [1] = {
    [0] = {
      key = "NetWorth"
      value = "About 10 bucks"
    }
    [1] = {
      key = "LastName"
      value = "Schmoe"
    }
    [2] = {
      key = "Age"
      value = "37"
    }
    [3] = {
      key = "FirstName"
      value = "Joe"
    }
  }
}

我建议首先使用peopleList完全为空 - 不要担心空行:

> var peopleList: [Dictionary<String, String>] = []
[[String : String]] = 0 values