当前位置: 首页 > 知识库问答 >
问题:

Swift TableView ImageView+Label=致命错误:索引超出范围

史承福
2023-03-14

我正在使用一个tableview来显示一个项目的标题,包括图像。 我使用的是FirebaseStorage和FireBaseDatabase。

问题是,当我只有一个保护,我得到“致命错误:索引超出范围”,只要我点击标题。 当我有一个以上的项目,你可以看到什么发生在视频。

也许有人能帮我,因为索引处理有些不对劲。 :)

import UIKit
import Kingfisher
import Foundation
import FirebaseStorage
import FirebaseDatabase

class HomeViewController: UIViewController  {

    // MARK: - Properties

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var addProject: UIButton!


    var posts = [Post]()



    var textToBeSent: String = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        UserService.posts(for: User.current) { (posts) in
            self.posts = posts
            self.tableView.reloadData()
        }

        Utilities.addShadowtoButton(addProject)

    }

    func configureTableView() {
        // remove separators for empty cells
        tableView.tableFooterView = UIView()
        // remove separators from cells
        tableView.separatorStyle = .none
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toDetails" {
            let destVC = segue.destination as! ShowProjectDetailsViewController
            destVC.post = sender as? Post
        }
    }

}
extension Collection where Indices.Iterator.Element == Index {
             public subscript(safe index: Index) -> Iterator.Element? {
               return (startIndex <= index && index < endIndex) ? self[index] : nil
             }
          }

// MARK: - UITableViewDataSource

extension HomeViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let post = posts[indexPath.row]
        performSegue(withIdentifier: "toDetails", sender: post)

    }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return 2
  }

    func numberOfSections(in tableView: UITableView) -> Int {
        return posts.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let post = posts[indexPath.section]

        switch indexPath.row {
        case 0:

            let cell = tableView.dequeueReusableCell(withIdentifier: "PostImageCell") as! PostImageCell
            let imageURL = URL(string: post.imageURL)
            cell.postImageView.kf.setImage(with: imageURL)

            return cell

        case 1:

            let cell = tableView.dequeueReusableCell(withIdentifier: "PostSubCell") as! PostSubCell
            cell.projectName.text = post.projectTitle

            return cell


        default:
            fatalError("Error: unexpected indexPath.")
        }
    }

}

// MARK: - UITableViewDelegate

extension HomeViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        switch indexPath.row {
        case 0:

           let post = posts[indexPath.section]
           return post.imageHeight

        case 1:

       return PostSubCell.height

        default:
            fatalError()
        }
    }
    }



import Foundation
import FirebaseAuth.FIRUser
import FirebaseDatabase
import FirebaseUI
import FirebaseAuth


struct UserService {

         static func posts(for user: User, completion: @escaping ([Post]) -> Void) {

            let ref = Database.database().reference().child("posts").child(user.uid)

            ref.observe(DataEventType.value, with: { (snapshot) in
               guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
                   return completion([])
            }

            let posts = snapshot.reversed().compactMap(Post.init)
            completion(posts)
        })
    }

}


import Foundation
import UIKit
import FirebaseDatabase.FIRDataSnapshot

class Post {

//      Next let's add properties to store all the additional information we need. Add the following to your post class.
    var key: String?

       let imageURL: String
       let imageHeight: CGFloat
       let creationDate: Date
       let imageName: String
       let projectTitle: String
       let projectLocation: String
       let projectDescription: String
       let projectBeginn: String
       let projectEnd: String


//    You'll get some compiler errors for not having any initializers or default values for certain properties. Let's go ahead and fix that:

    init(imageURL: String, imageName: String, imageHeight: CGFloat, projectTitle: String, projectLocation: String, projectDescription: String, projectBeginn: String, projectEnd: String) {
        self.imageURL = imageURL
        self.imageName = imageName
        self.imageHeight = imageHeight
        self.creationDate = Date()
        self.projectTitle = projectTitle
        self.projectLocation = projectLocation
        self.projectDescription = projectDescription
        self.projectBeginn = projectBeginn
        self.projectEnd = projectEnd
    }

    var dictValue: [String : Any] {
        let createdAgo = creationDate.timeIntervalSince1970

        return ["image_url" : imageURL,
                "image_name" : imageName,
                "image_height" : imageHeight,
                "created_at" : createdAgo,
                "projectTitle" : projectTitle,
                "projectLocation" : projectLocation,
                "projectDescription" : projectDescription,
                "projectBeginn" : projectBeginn,
                "projectEnd": projectEnd ]

    }
    init?(snapshot: DataSnapshot) {
        guard let dict = snapshot.value as? [String : Any],
            let imageURL = dict["image_url"] as? String,
            let imageName = dict["image_name"] as? String,
            let imageHeight = dict["image_height"] as? CGFloat,
            let createdAgo = dict["created_at"] as? TimeInterval,
            let projectTitle = dict["projectTitle"] as? String,
            let projectLocation = dict["projectLocation"] as? String,
            let projectDescription = dict["projectDescription"] as? String,
            let projectBeginn = dict["projectBeginn"] as? String,
            let projectEnd = dict["projectEnd"] as? String




            else { return nil }

        self.key = snapshot.key
        self.imageURL = imageURL
        self.imageName = imageName
        self.imageHeight = imageHeight
        self.creationDate = Date(timeIntervalSince1970: createdAgo)
        self.projectTitle = projectTitle
        self.projectLocation = projectLocation
        self.projectDescription = projectDescription
        self.projectBeginn = projectBeginn
        self.projectEnd = projectEnd

       }
  }


谢谢你的帮助!

共有1个答案

颛孙越
2023-03-14

您通过[Post]创建了NumberOfSection。 还可以在单击indexpath.row时分配PerformSeGue。 因此它会抛出一个错误,您必须在DidSelectItem()方法中使用indexPath.section而不是indexPath.row

例如。

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)   
 {
     let post = posts[indexPath.section] // Use here section instead of row
     performSegue(withIdentifier: "toDetails", sender: post)

 }
 类似资料:
  • 问题内容: 我的函数中不断出现此错误 我正在尝试读取数组answerRecord中的值。我使用一个全局变量arrayCount,它跟踪im当前指向哪个索引。 我在较早的函数中做了一个println,它为var arrayCount返回一个整数1的值,因此arrayCount不为空。因此,它应该能够将数组解释为: *假设arrayCount现在为1 answerRecord [arrayCount]

  • 在com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)在com.microsoft.sqlserver.jdbc.SQLServerPrearedStatement.setterGetParam(SQLServerPrearedStatement.java:9

  • 我已经使用创建了“CfnUserPool”对象https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_cognito/CfnUserPool.html aws文件。 我想获取UserPool的“Pool Id”。其Id值为“us-east-1_4kxxxxxx”。我使用python尝试了很多选项来获取这个值,但都没有成功。 所以我

  • 错误 ()1中的索引器错误回溯(最近一次调用)---- ~/Documents/PhD/IntelliSys19/journal/ColdStart_实验/相似性_函数。用户中u2的装饰矩阵中的py()145:146评级1=np。nan_to_num(np.array(user_ratings_matrix.iloc[u1-1].values))-- ~/anaconda3/lib/python3

  • 我试着运行这个: 但是得到这个错误: 回溯(最后一次调用): 文件“C:\Users\Shakh\Desktop\Hello3.py”,第4行,在 打印(“Hallo”,sys.argv[1]) 索引器:列表索引超出范围

  • 我使用带有AnyLogic的外部数据库来检查数据库中是否存在数据。如果没有,那么我需要插入并执行另一个操作。然而,我得到了这个错误 jdbc。SQLServerException:索引1超出范围。 这是我的代码。 下面是完整的错误消息

  • 问题内容: 在修改子视图依赖于绑定对象的数组时,我在避免索引超出范围错误时遇到了一些麻烦。 我有一个称为WorkoutList的父视图。WorkoutList具有ActiveWorkoutStore的EnvironmentObject。ActiveWorkoutStore是一个ObservableObject,它具有Workout对象的数组。我有一个从ActiveWorkoutStore检索的积极

  • 问题内容: 我目前正在从一本名为《 Python绝对入门》(第三版)的书中学习python。书中有一个练习,概述了一个子手游戏的代码。我遵循了这段代码,但是我在程序的中间不断返回错误。 这是导致问题的代码: 这也是它返回的错误: 有人可以帮助我解决出现的问题以及如何解决该问题吗? 编辑:我像这样初始化so_far变量: 问题答案: 您好像缩进得太多了。尝试这个: