Новое в разработке для IOS: сбой при нажатии на ячейку комментария - PullRequest
1 голос
/ 22 апреля 2019

Приложение успешно собирается, но после запуска приложения, после нажатия на ячейку комментария, приложение вылетает, что приводит к ошибкам:

Завершение работы приложения из-за необработанного исключения «NSRangeException», причина: «*** - [__ NSSingleObjectArrayI objectAtIndex:]: индекс 7 за пределами [0 .. 0]» и поток 1: сигнал SIGABRT.

На следующем рисунке, когда я нажимаю на любой Alec1 со случайным комментарием, приложение вылетает.

https://i.ibb.co/Sn5gFZ3/Screen-Shot-2019-04-22-at-12-49-19-AM.png

var posts = [PFObject]()    
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self

    // Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)


    let query = PFQuery(className: "Posts")
     query.includeKeys(["author", "comments", "comments.author"])
    query.limit = 20
    query.findObjectsInBackground{ (posts, error) in
        if posts != nil{
            self.posts = posts!
            self.tableView.reloadData()
        }
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let post = posts[section]
    let comments = (post["comments"] as? [PFObject]) ?? []
    return comments.count + 1
}

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



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     let post = posts[indexPath.section]
    let comments = (post["comments"] as? [PFObject]) ?? []


    if indexPath.row == 0{
    let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell")  as! PostCell


    let user = post["author"] as! PFUser
    cell.usernameLabel.text = user.username

    cell.captionLabel.text = post["caption"] as! String


    let imageFile = post["image"] as! PFFileObject
    let urlString = imageFile.url
    let url = URL(string: urlString!)!

    cell.photoView.af_setImage(withURL: url)

    return cell
    }else{
        let cell = tableView.dequeueReusableCell(withIdentifier: "CommentCell") as! CommentCell

        let comment = comments[indexPath.row - 1]
        cell.commentLabel.text = comment["text"] as? String
        let user = comment ["author"] as! PFUser
        cell.nameLabel.text = user.username
        return cell


    }
}
//creates new columns
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let post = posts[indexPath.row]
    let comment = PFObject(className: "Comments")
    comment["text"] = "random comment"
    comment["post"] = "post"
    comment["author"] = PFUser.current()
    post.add(comment, forKey: "comments")
    post.saveInBackground{(success, error) in
        if success{
            print("comment saved!")

        }else{
            print("error saving comments")
        }

    }

}

Ожидаемые результаты состоят в том, что после нажатия на определенные части ячейки комментария приложение не должно аварийно завершить работу

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Ваш массив сообщений пуст, добавьте проверку, что

guard !posts.isEmpty else { return }
0 голосов
/ 22 апреля 2019

В didSelectRowAt используйте section, чтобы получить post, а затем выберите комментарий,

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let post = posts[indexPath.section]
    let comments = (post["comments"] as? [PFObject]) ?? []

    let comment = comments[indexPath.row]
    comment["text"] = "random comment"
    comment["post"] = "post"
    comment["author"] = PFUser.current()
    post.add(comment, forKey: "comments")
    post.saveInBackground{(success, error) in
        if success{
            print("comment saved!")

        }else{
            print("error saving comments")
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...