当我尝试将图片添加到收藏集时,应用程序崩溃.斯威夫特



当我将TattooIdeas屏幕上的图像添加到FavoriteTattooIdeas屏幕中的集合时,应用程序崩溃并出现错误"UICollectionView必须使用非null布局参数"进行初始化;。

类TattooIdeasViewController:UIViewController{//某些代码

//我认为错误在代码的这一部分。

"@objc私有函数addBarButtonTapped(({

let selectedPhotos = collectionView.indexPathsForSelectedItems?.reduce([], { (photosss, indexPath) -> [Result] in
var mutablePhotos = photosss
let photo = photos[indexPath.item]
mutablePhotos.append(photo)
return mutablePhotos
})

let alertController = UIAlertController(title: "", message: "(selectedPhotos!.count) фото будут добавлены в альбом", preferredStyle: .alert)
let add = UIAlertAction(title: "Добавить", style: .default) { (action) in

let favVC = FavouritesTattooIdeaController()
favVC.photos.append(contentsOf: selectedPhotos ?? [])
favVC.collectionView.reloadData()

self.refresh()
}
let cancel = UIAlertAction(title: "Отменить", style: .cancel) { (action) in
}
alertController.addAction(add)
alertController.addAction(cancel)
present(alertController, animated: true)
}

''

如果我声明let favVC=FavoritesTattooIdeaController(collectionViewLayout:UICollectionViewFlowLayout(((,那么应用程序不会崩溃,但图片不会显示在FavoriteTattooIdeas屏幕上的collectionView中。

class FavoritesTattooIdeaController:UICollectionViewController{

var photos = [Result]()
private let enterSearchTermLabel: UILabel = {
let label = UILabel()
label.text = "You haven't add a photos yet"
label.textAlignment = .center
label.font = UIFont.boldSystemFont(ofSize: 20)
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func viewDidLoad() {
super.viewDidLoad()

collectionView.backgroundColor = .white
collectionView.register(FavouritesTattooIdeaCell.self, forCellWithReuseIdentifier: FavouritesTattooIdeaCell.reuseId)
collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.minimumInteritemSpacing = 1
layout.minimumLineSpacing = 1

setupEnterLabel()
}
private func setupEnterLabel() {
collectionView.addSubview(enterSearchTermLabel)
enterSearchTermLabel.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true
enterSearchTermLabel.topAnchor.constraint(equalTo: collectionView.topAnchor, constant: 50).isActive = true
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
enterSearchTermLabel.isHidden = photos.count != 0
return photos.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FavouritesTattooIdeaCell.reuseId, for: indexPath) as! FavouritesTattooIdeaCell
let googlePhoto = photos[indexPath.item]
cell.googlePhoto = googlePhoto
return cell
}

}

// MARK: - UICollectionViewDelegateFlowLayout

扩展收藏夹attooIdeaController:UICollectionViewDelegateFlowLayout{

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.frame.width
return CGSize(width: width/3 - 1, height: width/3 - 1)
}

}

您忽略了FavouritesTattooIdeaController()FavouritesTattooIdeaController.init()的缩写这一事实。在这里,你正在创建一个新的对象。与FavouritesTattooIdeaController(collectionViewLayout:)FavouritesTattooIdeaController.init(collectionViewLayout:)相同。

发生了什么:

您正在UIAlertAction中创建一个FavouritesTattooIdeaController的新对象。然后,稍后您将创建一个新的FavouritesTattooIdeaController来显示它。但它们彼此没有关联。

想象一下,init()就像得到一个新的空盒子
所以你创建了一个新的盒子,放上你最喜欢的照片,然后因为你不使用它,你就把它丢弃了。然后,当你想显示你的收藏夹时,你会再次创建一个新的空框,并希望将以前的项目放在另一个框中。看到问题了吗?

解决问题:

您需要在TattooIdeasViewController中保留一个selectedPhotos数组。当你显示它时,把它放在FavouritesTattooIdeaController上。

使用相同的变量FavouritesTattooIdeaController(无论它是TattooIdeasViewController的一个属性(,所以每次添加照片,它都会保留所有照片。

最新更新