将[AnyObject]插入[NSMutableDictionary]

时间:2015-07-07 22:04:30

标签: swift cocoa nstableview

我正在尝试使用带有两列的tableView构建一个应用程序(一个显示字符串,另一个显示每个字符串的CheckBox)。 字符串来自[AnyObject]变量。 我已经尝试了很多东西将[AnyObject]的结果插入到NsMutableDictionnary(由NsTableView使用)中,但它们都不起作用。 我必须使用正确数量的对象(与[AnyObject]的结果相关)手动构建dic以使其工作,但我希望dic能够自动构建。

以下是代码的示例,如果[AnyObject]由4个元素组成,则可以正常工作。 TableView列名是" jobs"和"卸载" :

import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate,NSTableViewDataSource,NSTableViewDelegate {

@IBOutlet weak var window: NSWindow!
@IBOutlet weak var myTableView: NSTableView!
var dataArray:[NSMutableDictionary] = [["jobs": "", "unload": 0],["jobs": "", "unload": 0],["jobs": "", "unload": 0],["jobs": "", "unload": 0]];

func applicationDidFinishLaunching(aNotification: NSNotification) {
...
...
...
var ctlelems:[AnyObject] = grepOut!.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
dataArray = [["jobs": "ctlelems[0]", "unload": 0],["jobs": "ctlelems[1]", "unload": 0],["jobs": "ctlelems[2]", "unload": 0],["jobs": "ctlelems[3]", "unload": 0]];
}
    func applicationWillTerminate(aNotification: NSNotification) {

    }
    func numberOfRowsInTableView(aTableView: NSTableView) -> Int
    {
        return dataArray.count
    }
func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject?
    {
        let object = dataArray[row] as NSMutableDictionary
        if ((tableColumn!.identifier) == "unload")
        {
            println(object)
            return object[tableColumn!.identifier] as? Int!
        }
        else
        {

            return object[tableColumn!.identifier] as? String!
        }
    }

    func tableView(tableView: NSTableView, setObjectValue object: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row: Int)
    {
        dataArray[row].setObject(object!, forKey: (tableColumn?.identifier)!)
    }
}

我想做以下事情,

var x: Int = 0
for lines in ctlelems {
            dataArray = [["jobs": ctlelems[x], "unload": 0]];
            x=x+1
        }

但它不起作用。 大部分时间我都会找到"发现nill"错误,或仅显示[AnyObject]的最后一个元素。 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

dataArray = [["jobs": ctlelems[x], "unload": 0]];

这意味着您需要在每次迭代时重新定义dataArray。您应该改为dataArray

声明并初始化您的dataArray

var dataArray = [Dictionary<String, Any>]()

并追加:

for line in ctlelems {
    dataArray.append(["jobs": line, "unload": 0])
}

或以更加迅速的方式:

dataArray = ctlelems.map { ["jobs": $0, "unload": 0] }