将数据解析为NSTableView

时间:2014-08-01 21:41:36

标签: swift nstableview

Hello其他程序员,

首先,我是OSX / iOS编程的新手,我正在尝试学习swift。我在java方面相当称职,并希望自学一些新东西。我知道快速的编程语言已处于早期阶段。

我有一个使用parse.com数据浏览器的表。我可以从该表中获取元素并将它们存储在一个数组中。通常,在java中,我会简单地迭代这些元素并填充JTable。现在,我的问题是......我将如何做到这一点?我试过读苹果api,我觉得我的智商下降了。我可以理解getNumberOfRows函数/方法,但其他函数对我来说毫无意义。我的xib文件中有一个NSTable,并且将委托和数据源放在app委托文件中。如何设置标识符以便我可以开始设置信息。

我知道我并没有真正帮助,但我们非常感谢任何建议。

谢谢。

2 个答案:

答案 0 :(得分:15)

是的,与Cocoa的tableviews很复杂。

在tableview中获取内容的绝对基础是设置其数据源,该数据源必须采用NSTableViewDataSource协议。然后,您必须区分基于视图和基于单元格的tableview。在基于视图的视图中,您可以使用在Interface Builder中设计的视图,基于单元格的视图更古老,更简单。您了解numberOfRowsInTableView函数,因此我继续使用更复杂的函数。

基于Cell的TableVies

对于基于单元格的tableViews,第二个基本函数## Heading ##是

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

当你刚刚得到它时,它很容易。作为第一个参数,您可以获得tableView(仅当您为多个tableView使用相同的dataSource时才会感兴趣)。 第二个指定tableColumn。您可以使用其标识符来标识列。您在InterfaceBuilder中设置此标识符。单击您的tableview直到选中一列。然后在侧栏中设置Restoration ID。 作为最后一个参数,你得到你的行。您返回AnyObject类型的对象。我通常会返回一个字符串,我不知道NSNumber是否也有效。 一个简单的示例实现如下:

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

    var columnIdentifier = tableColumn.identifier
    if columnIdentifier == "number" {
        result = "\(row+1)"
    }
    if columnIdentifier == "name" {
        result = model.persons[row].name
    }
    if columnIdentifier == "lastName" {
        result = model.persons[row].lastName
    }
    return result
}

如果要设置值,请使用

func tableView(tableView: NSTableView!, setObjectValue object: AnyObject!, forTableColumn tableColumn: NSTableColumn!, row: Int)

Object表示应传输到数据模型的新值。

基于视图的TableViews

在基于视图的tableViews中,事情有所不同。

在这里,您必须在单独的nib文件中设计自定义视图。然后,在初始化程序中注册nib。

let nib = NSNib(nibNamed: "Example", bundle: NSBundle.mainBundle())
        self.tableView.registerNib(nib, forIdentifier: "Example")

这允许您使用makeViewWithIdentifier:owner:创建视图的实例 然后你可以配置你的视图(我喜欢为此子类化NSView)并将其作为

的结果传回去
func tableView(tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row: Int) -> NSView!

示例实施:

func tableView(tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row: Int) -> NSView!{
    let view = tableView.makeViewWithIdentifier("Example", owner: self) as MyCustomView
    view.field1.stringValue = model.persons[row].name
    view.field2.stringValue = model.persons[row].lastName
    view.field3.stringValue = "\(row+1)"
    return view
}

答案 1 :(得分:-2)

我们在iOS中的方式是,在我们实现的TableView的Delegate和Datasource类中

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{


    var ident = "cellIdentifier"
    var cell = self.tableView.dequeueReusableCellWithIdentifier(ident) as UITableViewCell
    if (cell == nil) {
        cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: ident)
    }
    cell.textLabel.text = myTitleArray[indexPath.row]
    return cell

}

要处理用户选择行:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!){

}

告诉它有多少行:

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{
    return myTitleArray.count
}

myTitleArray是您的标题数组,显然您可以根据需要更改它。

您找出实际应该放置的内容的方式var ident = "cellIdentifier" 是你在故事板中为动态原型单元格提供的标识符

我同意Apple Developer Class Reference有时会让人感到困惑,而且他们通常会Programming Guide更有帮助。

尝试查看here,了解我所了解的内容。

如果您对iOS编程非常感兴趣,请查看these free Stanford lectures on iTunes U,特别是11,12和13,讨论UITableView。它们在iOS 7中,所以没有关于Swift,但UITableView实现的唯一真正区别是这些语言之间的语法