如何在Swift中显示与数组列表对应的图像

时间:2015-12-17 05:20:05

标签: ios arrays swift

在下面的代码中,我使用图像文件名列表初始化了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
        }

5 个答案:

答案 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)