在下面的代码中,我使用图像文件名列表初始化了Images
数组。我希望图像的顺序与Names
数组的顺序对齐。这就是我的尝试,我得到一个错误说
Thread 1: EXC_BAD_INSTRUCTION ( code=EXC_I386_INVOP, subcode = 0x0)
控制台输出:致命错误:数组索引超出范围 (lldb)
代码
class NonameTableViewController: UITableViewController {
var Names = [" Ferro", "Korean", "HUH?","CatCafe", "UINITY", "FAKESTORE" ,"IRANOUTOFNAMES", "OKAY", "KEEP CODING"]
var Images = ["cafedeadend.jpg", "homei.jpg", "teakha.jpg", "cafelois1.jpg"," petiteoyster.jpg", "forkeerestaurant.jpg"]
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIndentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIndentifier, forIndexPath: indexPath)
//configure cell
cell.textLabel?.text = Names[indexPath.row]
cell.imageView?.image = UIImage(named: Images[indexPath.row])
return cell
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return Names.count
}
答案 0 :(得分:1)
只需更改numberOfRowsInSection
功能:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return min(Names.count, Images.count)
}
这将确保您只显示 的名称和图像的图像的图像/名称。
答案 1 :(得分:0)
"数组索引超出范围"意味着您正在寻找数量少于 n 项目的 n 项目。之一:
tableView:numberOfRowsInSection:
方法返回的数字大于您的姓名数量或图片数量,或者您应该拥有与名称一样多的图像,或者您应该通过重复较小范围内的选择来填充大量数字。 (查看模%
运算符。)无论哪种方式,您应该告诉表视图,您只有与它们有数据的行一样多的行。
答案 2 :(得分:0)
numberOfRowsInSection 的行数为
Names.count //即9
但您的Images数组包含6个图像名称。所以你得到了那个例外。在名称数组中保留6个名称,在图像数组中保留9个图像。
答案 3 :(得分:0)
正如其他人在此处所述,当您尝试访问超出该数组范围的索引时,会导致崩溃/错误。 此外,正如所指出的,您可以更新图像数组,使其具有与名称数组相同数量的元素,或者您可以通过应用nickfalk描述的解决方案来避免访问元素超出范围。
另一种解决方案是为索引超出范围的情况提供默认值:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIndentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIndentifier, forIndexPath: indexPath)
//configure cell
cell.textLabel?.text = names[indexPath.row]
if let imageName = (indexPath.row >= images.count ? "placeholderImage.jpg" : images[indexPath.row]) as String? {
cell.imageView?.image = UIImage(named: imageName)
}
return cell
}
这允许您显示所有名称,同时当数据中的图像集不存在于资源中或图像名称拼写错误时,也会提供后备图像。
请注意,我更改了var
的名称以小写字母开头,我强烈建议您遵循Swift的命名约定。请参阅raywenderlich.com Swift Style Guide作为示例。
我希望这有助于解决您的问题。
答案 4 :(得分:0)
numberOfRowsInSection中存在错误,它肯定会起作用
return min(Names.count, Images.count)