如何在Swift中将UITableView的单元格文本设置为数据库单元格的内容?

时间:2015-01-31 19:53:15

标签: ios iphone sqlite uitableview swift

我正在使用Swift为我的A2计算课程创建一个iOS神奇宝贝数据库应用程序。在这个项目之前,我还没有使用Swift,所以我正在教自己使用相关的例子,我希望可以复制和粘贴。

我正在使用Xcode 6.1.1和SQLite.swift library from Stephen Celis

一个这样的测试就是生成一个UITableView,它可以从我之前存在的预先填充的数据库中读取。

我设法让UITableView创建所有单元格 - 并将detailTextLabel设置为indexPath(加1,因此它从1开始,到721结束,而不是从0开始,到720结束)。所以我在桌子上有721个细胞就好了。

但是,我似乎无法让每个单元格的textLabel显示正确的数据。相反,它为每个单元格显示“SQLite.Expression”。

在ViewController.swift文件中的ViewController类之上,我有

let db = Database("/Users/rhysmorgan/Documents/Coding/DatabaseLoadTest/Pokémon Database.sqlite", readonly: true)
let pokemonTable = db["Pokémon"]
let name = Expression<String>("PokéName")
let gen = Expression<Int>("Generation")

并在主tableView函数中,我有

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

    let cellIdentifier = "Cell"
    let rowno: Int = indexPath.row + 1
    let formatter = NSNumberFormatter(); formatter.minimumIntegerDigits = 3
    let formattedrowno = formatter.stringFromNumber(rowno)
    let pokemonname = pokemonTable[name]


    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell

        cell.textLabel?.text = "\(pokemonname)"
        cell.detailTextLabel?.text = "\(formattedrowno!)"

    return cell
}

有人能帮助我吗? 提前谢谢!

编辑:我设法让它通过包装

显示第一行的正确值
cell.textLabel?.text = "\(pokemonname)"
cell.detailTextLabel?.text = "\(formattedrowno!)"

中的

for pokemon in pokemonTable {
/*insert above lines*/
}

循环并添加

println(pokemon[name])

生成每条记录,打印其“PokéName”列数据。然后又重复了13次。因此,它将第一个记录的“PokéName”列数据一直打印到第721列的“PokéName”数据,循环回到第一个并重复此操作。但是,tableview的标签文本仍未更新。

1 个答案:

答案 0 :(得分:2)

正如您在编辑中发现的那样,必须执行查询才能访问基础数据,这在运行for - in循环时会发生。您可以将数据存储在内存中,而不是调用for - in,例如

let data = Array(pokemonTable)
let cellIdentifier = "Cell"
lazy var formatter: NSNumberFormatter = {
    let formatter = NSNumberFormatter()
    formatter.minimumIntegerDigits = 3
    return formatter
}()

func tableView(
    tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath
) -> UITableViewCell {
    let idx = indexPath.row
    let rowNo = formatter.stringFromNumber(idx + 1)
    let pokemonName = data[idx][name]

    let cell = tableView.dequeueReusableCellWithIdentifier(
        cellIdentifier, forIndexPath: indexPath
    ) as UITableViewCell

    cell.textLabel?.text = pokemonName
    cell.detailTextLabel?.text = rowNo

    return cell
}

在这种情况下,我们执行一次SQL查询,将所有行存储在data数组中(请参阅第一行),然后使用tableView:cellForRowAtIndexPath:方法访问该数组。 / p>


在编辑之前,为了完成,请看一下这一行:

let pokemonname = pokemonTable[name]

这是通过使用您之前定义的SQL标识符对表名进行子脚本编写来创建嵌套的SQL标识符。在这种情况下:

"Pokémon"."PokéName"

请参阅文档的Column Namespacing部分。