Снимки, случайно перемещающиеся в UITableView после перезагрузки данных - PullRequest
0 голосов
/ 07 июня 2018

Изображения в моем tableView смещаются и не отображаются на правильных сообщениях после перезагрузки tableView.Я не могу понять, как это исправить.

https://i.stack.imgur.com/4hUbYm.jpg

Изображение выше будет нормальным изображением, однако иногда я получаю:

https://i.stack.imgur.com/PVEVrm.png

Я также выполнил функцию prepareForReuse () в пользовательском классе ячеек, но все еще не работает.

Вот исходный код:

class UserPostsController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var userPostsTable: UITableView!

    var images : [UIImage] = []
    var descriptions : [String] = []
    var likes : [String] = []
    var dislikes : [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.font: UIFont(name: "Pacifico", size: 30)!]

        userPostsTable.dataSource = self
        userPostsTable.delegate = self

        let postQuery = PFQuery(className: "Post")
        postQuery.whereKey("userid", equalTo: PFUser.current()?.objectId as Any)
        postQuery.findObjectsInBackground { (objects, error) in
            if let posts = objects {
                for post in posts {
                    if let descripiton = post["description"] {
                        self.descriptions.append(descripiton as! String)
                    }
                    if let l = post["likes"] {
                        self.likes.append(l as! String)
                    }
                    if let d = post["dislikes"] {
                        self.dislikes.append(d as! String)
                    }
                    if let imageFile = post["imageFile"] as? PFFile {
                        imageFile.getDataInBackground(block: { (data, error) in
                            if let imageData = data {
                                if let image = UIImage(data: imageData) {
                                    self.images.append(image)
                                }
                            }
                            self.userPostsTable.reloadData()    
                        })
                    }
                }
            }
        }
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = userPostsTable.dequeueReusableCell(withIdentifier: "userPostCell", for: indexPath) as? UserPostsTableViewCell {
            cell.descriptionLabel.text = descriptions[indexPath.row]
            cell.numerLikes.text = "\(likes[indexPath.row]) likes"
            cell.numberDislikes.text = "\(dislikes[indexPath.row]) dislikes"
            cell.postImage.image = images[indexPath.row]

            cell.selectionStyle = .none

            return cell
        }
        return UITableViewCell()
    }

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, что ваша проблема здесь:

if let imageFile = post["imageFile"] as? PFFile {
                    imageFile.getDataInBackground(block: { (data, error) in
                        if let imageData = data {
                            if let image = UIImage(data: imageData) {
                                self.images.append(image)

                            }

                        }
                        self.userPostsTable.reloadData()    
                    })

Вы запускаете фоновые задачи , чтобы получить данные изображений. Любая из этих задач может быть выполнена в первую очередь , пожалуйста, отладьте ваш массив, и вы можете обнаружить, что изображения расположены не в нужном порядке.

Вот пример яблочного проекта это может помочь вам правильно загрузить эти изображения в фоновом режиме.

https://developer.apple.com/library/archive/samplecode/LazyTableImages/Introduction/Intro.html

...