为什么tableview没有显示正确的图像?

时间:2018-03-24 23:11:32

标签: ios swift uitableview uicollectionview

我有两个Viewcontroller A和B.A会在collectionview中下载所有照片,然后我可以点击单个单元格转到Viewcontroller B,这是表格视图,只显示从A传递的这个单个图像。

但它在应用程序第一次午餐时工作正常,但是一旦我在collectionview中添加新照片,然后我点击这张新照片转到Viewcontroller B但是B没有显示正确的照片显示其他照片。我在viewcronller A和B中打印出照片数据postImg,数据相同,但B没有显示正确的照片。为什么?当我重建程序时它的工作问题似乎只发生在我添加新照片时。

以下是从服务器加载图片的代码

func loadPosts(){

        let query = PFQuery(className: "posts")
        query.whereKey("username", equalTo:PFUser.current()!.username!) 
        query.skip = self.picArray.count // skip the already loaded images

        query.findObjectsInBackground { (objects, error) in

            if error == nil {

             if let objects  = objects{ 
                for object in objects{       
                    self.collectionView?.performBatchUpdates({
                        let indexPath = IndexPath(row: self.uuidArray.count, section: 0)
                        self.uuidArray.append(object.value(forKey: "uuid") as! String)
                        self.picArray.append(object.value(forKey: "pic") as! PFFile)
                        self.collectionView?.insertItems(at: [indexPath])
                    }, completion: nil)

                }
              }
            } else{
                print(error!.localizedDescription)
            }
        }
     }

然后var postImgData = [UIImage]()是用于保存从上面的函数下载的所有照片的数组,这种可行性在CLASS Viewcontroll A的开头定义。

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return picArray.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    //define cell

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! pictureCell


        picArray[indexPath.row].getDataInBackground { (data, error) in

            if error == nil {
                cell.picImg.image = UIImage(data: data!)
                self.postImgData.append(UIImage(data: data!)!)


            } else {
                print(error!.localizedDescription)
            }
        }
        return cell
    }

然后我点击单元格转到viewcontroller B。 postImg在Viewcontroller B的开头定义为全局可行的,以获取您在Viewcontroller A单元格上单击的图像日期。

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    postImg = postImgData[indexPath.row]
    let post = storyboard?.instantiateViewController(withIdentifier: "postVC") as! postVC
    self.navigationController?.pushViewController(post, animated: true)

}

然后在Viewcotnroller B中显示照片

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! postCell

    cell.picImg.image = postImg

    return cell
}

1 个答案:

答案 0 :(得分:0)

首先:

void eliminate() {
    char buff1[1000], buff2[1000], b[1000];
    char* p = a, *q = b, *pq = b;
    sprintf(q, "%s", p);
    while (q != NULL && *q != '\0')
    {
        if (iswspace(*q))
        {
            sscanf(pq, "%s %s", buff1, buff2);
            sprintf(p, "%s%s", buff1, buff2);
            p += strlen(buff1);
            pq = ++q;
        }
        q++;
    }
}

你应该事先初始化数组并设置像self.postImgData [indexPath.row] = UIImage(数据:数据!)这样的数据! 我们如何确保图像的正确顺序

2

picArray[indexPath.row].getDataInBackground { (data, error) in
    if error == nil {
        cell.picImg.image = UIImage(data: data!)
        self.postImgData.append(UIImage(data: data!)!) <== WHY do you append array?
    } else {
        print(error!.localizedDescription)
    }

所以我建议将 postImg var移动到控制器B