发件人:UIImageView !== CollectionViewCell 中的 UIImageView
Sender: UIImageView !== UIImageView within CollectionViewCell
我正在尝试让 UIImagePicker 在 CollectionViewCell 中显示和成像。 func 代码在 sender 应该等于 (==) 到 UIImageView 的地方被破坏。
我已经多次通过调试器修改代码,并尝试通过 visibleCells 函数调用单元格,但无济于事。
//Code for upload func
@objc func uploadPhoto(_ sender: UIImageView) {
let uploadPicker = UIImagePickerController()
uploadPicker.delegate = self
for cell in self.collectionView.visibleCells {
if let uploadCell = cell as? UploadImageCell {
print("Pickle Rick and \(uploadCell.imageContainer) and \(sender)")
if uploadCell.imageContainer == sender {
selectedCell = uploadCell
print("This code works, \(String(describing: selectedCell))")
} else {
print("code failed at if let")
}
}
}
present(uploadPicker, animated: true, completion: nil)
}
// Code for CollectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.section == 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: imageCellId, for: indexPath) as! UploadImageCell
//let imageOption = ImageOption(rawValue: indexPath.row)
//cell.imageContainer.image = imageOption?.icon()
cell.imageContainer.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(uploadPhoto(_:))))
return cell
}
/* other sections use different cells*/
}
//code for CollectionViewCell
class UploadImageCell: UICollectionViewCell {
// Mark: - Properties
weak var ep: EditProfileController?
let imageContainer: UIImageView = {
let imageContainer = UIImageView()
imageContainer.clipsToBounds = true
imageContainer.backgroundColor = .blue
imageContainer.isUserInteractionEnabled = true
imageContainer.translatesAutoresizingMaskIntoConstraints = false
return imageContainer
}()
let uploadButton: UIButton = {
let button = UIButton()
button.setTitle("Upload Image", for: .normal)
button.backgroundColor = UIColor.red
button.setTitleColor(.black, for: .normal)
button.layer.cornerRadius = 5
button.layer.shadowColor = UIColor.darkGray.cgColor
button.layer.shadowOffset = CGSize(width: button.frame.width, height: 2)
button.layer.shadowRadius = 5
button.layer.shadowOpacity = 1.0
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .white
addSubview(imageContainer)
NSLayoutConstraint.activate([
imageContainer.topAnchor.constraint(equalTo: topAnchor),
imageContainer.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.9),
imageContainer.widthAnchor.constraint(equalTo: widthAnchor)
])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
预期的结果是选择器图像显示在 CollectionViewCell.imageContainer 中。我的调试器总是打印 "code failed at if let" 并且 collectionView.reloadData 在加载视图后从未显示过不同的图像。
点击手势(或任何手势识别器)的选择器必须将实际的手势识别器作为该方法的唯一参数。所以你需要改变:
@objc func uploadPhoto(_ sender: UIImageView) {
至:
@objc func uploadPhoto(_ sender: UITapGestureRecognizer) {
然后就可以从手势的view
属性.
获取图像视图了
@objc func uploadPhoto(_ sender: UITapGestureRecognizer) {
guard let imageView = sender.view as? UIImageView { else return }
let uploadPicker = UIImagePickerController()
uploadPicker.delegate = self
for cell in self.collectionView.visibleCells {
if let uploadCell = cell as? UploadImageCell {
print("Pickle Rick and \(uploadCell.imageContainer) and \(sender)")
if uploadCell.imageContainer == imageView {
selectedCell = uploadCell
print("This code works, \(String(describing: selectedCell))")
} else {
print("code failed at if let")
}
}
}
present(uploadPicker, animated: true, completion: nil)
}
我正在尝试让 UIImagePicker 在 CollectionViewCell 中显示和成像。 func 代码在 sender 应该等于 (==) 到 UIImageView 的地方被破坏。
我已经多次通过调试器修改代码,并尝试通过 visibleCells 函数调用单元格,但无济于事。
//Code for upload func
@objc func uploadPhoto(_ sender: UIImageView) {
let uploadPicker = UIImagePickerController()
uploadPicker.delegate = self
for cell in self.collectionView.visibleCells {
if let uploadCell = cell as? UploadImageCell {
print("Pickle Rick and \(uploadCell.imageContainer) and \(sender)")
if uploadCell.imageContainer == sender {
selectedCell = uploadCell
print("This code works, \(String(describing: selectedCell))")
} else {
print("code failed at if let")
}
}
}
present(uploadPicker, animated: true, completion: nil)
}
// Code for CollectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.section == 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: imageCellId, for: indexPath) as! UploadImageCell
//let imageOption = ImageOption(rawValue: indexPath.row)
//cell.imageContainer.image = imageOption?.icon()
cell.imageContainer.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(uploadPhoto(_:))))
return cell
}
/* other sections use different cells*/
}
//code for CollectionViewCell
class UploadImageCell: UICollectionViewCell {
// Mark: - Properties
weak var ep: EditProfileController?
let imageContainer: UIImageView = {
let imageContainer = UIImageView()
imageContainer.clipsToBounds = true
imageContainer.backgroundColor = .blue
imageContainer.isUserInteractionEnabled = true
imageContainer.translatesAutoresizingMaskIntoConstraints = false
return imageContainer
}()
let uploadButton: UIButton = {
let button = UIButton()
button.setTitle("Upload Image", for: .normal)
button.backgroundColor = UIColor.red
button.setTitleColor(.black, for: .normal)
button.layer.cornerRadius = 5
button.layer.shadowColor = UIColor.darkGray.cgColor
button.layer.shadowOffset = CGSize(width: button.frame.width, height: 2)
button.layer.shadowRadius = 5
button.layer.shadowOpacity = 1.0
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .white
addSubview(imageContainer)
NSLayoutConstraint.activate([
imageContainer.topAnchor.constraint(equalTo: topAnchor),
imageContainer.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.9),
imageContainer.widthAnchor.constraint(equalTo: widthAnchor)
])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
预期的结果是选择器图像显示在 CollectionViewCell.imageContainer 中。我的调试器总是打印 "code failed at if let" 并且 collectionView.reloadData 在加载视图后从未显示过不同的图像。
点击手势(或任何手势识别器)的选择器必须将实际的手势识别器作为该方法的唯一参数。所以你需要改变:
@objc func uploadPhoto(_ sender: UIImageView) {
至:
@objc func uploadPhoto(_ sender: UITapGestureRecognizer) {
然后就可以从手势的view
属性.
@objc func uploadPhoto(_ sender: UITapGestureRecognizer) {
guard let imageView = sender.view as? UIImageView { else return }
let uploadPicker = UIImagePickerController()
uploadPicker.delegate = self
for cell in self.collectionView.visibleCells {
if let uploadCell = cell as? UploadImageCell {
print("Pickle Rick and \(uploadCell.imageContainer) and \(sender)")
if uploadCell.imageContainer == imageView {
selectedCell = uploadCell
print("This code works, \(String(describing: selectedCell))")
} else {
print("code failed at if let")
}
}
}
present(uploadPicker, animated: true, completion: nil)
}