Hello其他程序员,
首先,我是OSX / iOS编程的新手,我正在尝试学习swift。我在java方面相当称职,并希望自学一些新东西。我知道快速的编程语言已处于早期阶段。
我有一个使用parse.com数据浏览器的表。我可以从该表中获取元素并将它们存储在一个数组中。通常,在java中,我会简单地迭代这些元素并填充JTable。现在,我的问题是......我将如何做到这一点?我试过读苹果api,我觉得我的智商下降了。我可以理解getNumberOfRows函数/方法,但其他函数对我来说毫无意义。我的xib文件中有一个NSTable,并且将委托和数据源放在app委托文件中。如何设置标识符以便我可以开始设置信息。
我知道我并没有真正帮助,但我们非常感谢任何建议。
谢谢。
答案 0 :(得分:15)
是的,与Cocoa的tableviews很复杂。
在tableview中获取内容的绝对基础是设置其数据源,该数据源必须采用NSTableViewDataSource
协议。然后,您必须区分基于视图和基于单元格的tableview。在基于视图的视图中,您可以使用在Interface Builder中设计的视图,基于单元格的视图更古老,更简单。您了解numberOfRowsInTableView
函数,因此我继续使用更复杂的函数。
对于基于单元格的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中,事情有所不同。
在这里,您必须在单独的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实现的唯一真正区别是这些语言之间的语法