我有2个视图控制器:cameraVCdetailVC。该相机是AVFoundation相机,可以捕获然后选择图片,然后在imageViews上填充4个小的detailVC。我试图在两个VC之间滑动,以便当您在cameraVC上点击'是'时,将其添加到4个imageViews之一中。我目前正在使用for循环来实现这一目标,下面是我详细的VC中的代码。

当我第一次加载应用程序并拍摄一些照片时,它可以工作,但是当我滑动回到cameraVC然后又回到detailVC时,应用程序崩溃并在上面记录错误。

在我的代码中,我尝试将imageViewArray设置为imageArray中存在的任何图像。然后,每次我回到detailVC时,我都要清除imageView.images并重新分配它们。由于某种原因,它不起作用。有什么想法吗?

override func viewWillAppear(animated: Bool) {
    if imageArray.count == 1 {
        imageViewArray += [imageView1]
    } else if imageArray.count == 2 {
        imageViewArray += [imageView1,imageView2]
    } else if imageArray.count == 3 {
        imageViewArray += [imageView1,imageView2,imageView3]
    } else if imageArray.count == 4 {
        imageViewArray += [imageView1,imageView2,imageView3,imageView4]
    }

    for ima in imageViewArray {
        if ima.image != nil {
        ima.image = nil
        }
    }

    for (index, imageView) in imageViewArray.enumerate() {
        imageView.image = imageArray[index]
    }
}

最佳答案

添加行

imageViewArray = []

viewWillAppear的开头。

或将所有4个分支中的imageViewArray分配更改为类似以下内容:
imageViewArray = [imageView1,imageView2,imageView3,imageView4] // removed the "+"

您在这里遇到的问题是,在首次显示视图时以及在某些显示的视图被关闭/再次弹出时调用该方法,从而导致您的视图再次出现。

结果是imageViewArray仍然包含上次迭代的图像视图。再次添加图像会使数组变大。

假设您第一次有3张图像,现在第二次有4张图像。因此,您输入最后一个else部分,并向该数组添加4个新元素,从而使它具有7个元素,而imageArray仍然只有4个元素。现在,您遍历所有imageViewArray条目,并尝试以最高索引6访问imageArray,而数组仅包含值,直到索引3-> crash 为止。

请注意,写这个答案很烦人,因为您有太多变量,它们听起来和外观都相同imageViewimageimageArrayimageViewArrayimaimageViewX。请尝试查找更好的名称。

07-27 13:57