gpt4 book ai didi

ios - 在展开可选值时,将可选字符串分配给 UITableView 中的 UILabel 以意外发现 nil 结束

转载 作者:行者123 更新时间:2023-11-28 10:13:58 24 4
gpt4 key购买 nike

我的 Swift 编写的 iOS 应用程序中有一个 UITableView。此 UITableView 有 2 个类:TableViewController,用于控制表格,以及 TableViewCell,用于控制 UITableView 的单元格>.

HomeViewController 上,我从 DynamoDB 加载了 2 个东西,一个名为 items 的表中的项目数组,以及一个包含数量的 Int 变量名为 numberOfItems 的数组中的项目。我知道这些值不为零,因为我将它们打印到控制台进行检查,并且我在控制台中打印了有效结果。

tableView(numberOfRowsInSection:) 方法上我有这段代码:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("numberOfRowsInSection", HomeViewController.GlobalVars.numberOfItems)
return HomeViewController.GlobalVars.numberOfItems
}

方法中的 print 函数返回控制台应该有的确切项目数。

tableView(cellForRowAt:) 方法上我有这段代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "TableViewCell"
self.tableView.register(TableViewCell.self, forCellReuseIdentifier: cellIdentifier)
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCell else {
fatalError("The dequeued cell is not an instance of TableViewCell.")
}

print("indexPath.row", indexPath.row)
let item: Item = HomeViewController.GlobalVars.items[indexPath.row]
let name: String = item.name!
cell.itemNameLabel.text? = name

return cell
}

现在,代码中有些不明白的地方:
1) Item 是我的 DynamoDB 对象映射器。
2)itemNameLabelTableViewCell 中的一个 UILabel,我使用 Ctrl + Drag 从 Storyboard连接到 TableViewCell 文件。
3) 我正在打印 indexPath.row 的值,因为我之前收到关于 Index out of range 的 fatal error ,所以我添加了这个打印函数来检查是否索引在范围内(它是)。
4) 要检查 name 字符串是否有效,我添加了这一行来检查:

print("name", name)

我得到了项目的名称,没有任何错误打印在控制台上。

当前的问题是,每当我运行这段代码时,我都会在控制台上收到这个错误日志:

numberOfRowsInSection 3
numberOfRowsInSection 3
numberOfRowsInSection 3
numberOfRowsInSection 3
indexPath.row 0
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)

如您所见,出于某种原因,它打印了 4 次 numberOfRowsInSection,有时打印 3 次。

它一直运行到我将 UILabel 的文本设置为变量的行,但随后我收到 fatal error 消息。错误显示在我设置文本的行上,并显示以下错误消息:

Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0)

字符串本身可能是有效的,因为当我打印 name 变量时,我得到了我应该得到的值。

我该怎么做才能解决这个问题并在 UITableViewUILabel 上显示值?

编辑#1:
DynamoDB 对象映射器中的变量是可选的:

import UIKit
import AWSDynamoDB

class Item: AWSDynamoDBObjectModel, AWSDynamoDBModeling {

var id: String?
var category: String?
var name: String?

class func dynamoDBTableName() -> String {
return "Items"
}

class func hashKeyAttribute() -> String {
return "id"
}
}

最佳答案

说明:

可选项能够保存一个值或一个 nil。

除非您确定它包含非 nil 值,否则不要强行解包一个可选值。

解决方案:

let name: String = item.name
cell.itemNameLabel.text = name
  • cell.itemNameLabel.text 也是可选的,因此您不必解包 item.name
  • 如果你学习 Swift 的 Optionals 会更好。

引用:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

关于ios - 在展开可选值时,将可选字符串分配给 UITableView 中的 UILabel 以意外发现 nil 结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43935473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com