我的收藏夹视图中有2个部分:图像和相册。 每个部分都有自己的逻辑。通过点击相册 - 一些照片上传。 通过单击Image我想访问outlet UIView变量,但是我不能在内部类中使用didSelectItemAt indexPath方法。
class TwoViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
@IBOutlet var pickedPhotoView: UIView!
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! AlbumCell
<b>// Here is ok. i can access the pickedPhotoView variable</b>
view.addSubview(pickedPhotoView)
}
class ImagesCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// but here there is no chance to access pickedPhotoView variable
}
}
更新
class TwoViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, ImagesCellDelegate {
func doSomething(_ sender: ImagesCell) {
print("do something")
}
var imagesCell: ImagesCell = ImagesCell()
override func viewDidLoad() {
super.viewDidLoad()
imagesCell.delegate = self
}
}
protocol ImagesCellDelegate {
func doSomething(_ sender: ImagesCell)
}
class ImagesCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var delegate: ImagesCellDelegate!
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
delegate?.doSomething(self)
}
}
doSomething func未在TwoViewController中执行。 我想我做错了什么:
var imagesCell: ImagesCell = ImagesCell()
imagesCell.delegate = self
有什么想法吗? 感谢名单!
解决方案是:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
cell.delegate = self
}
答案 0 :(得分:0)
我无法发表评论,因为我没有足够的声誉,但你的问题不明确。 你有2个部分 - &gt;你可以在TwoViewController中确定当前的选择部分。
if indexPath.section == 0 {
// album
} else if indexPath.section == 1 {
// photo
}
或者,如果您想在用户与每个特定单元格交互时触发,您可以使用委托或闭包/块回调。
答案 1 :(得分:0)
为什么你必须将ImagesCell作为内部类? “类型为'TwoViewController'的实例成员'pickedPhotoView'不能用于嵌套类型'TwoViewController.ImagesCell'的实例 您可以像在AlbumCell中一样在TwoViewController之外创建ImagesCell。
答案 2 :(得分:0)
简而言之,您需要iOS中的委托模式。
class ImagesCell : : UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var delegate: ImagesCellDelegate!
}
protocol ImagesCellDelegate {
func doSomething()
}
extension TwoViewController: ImagesCellDelegate {
func doSomething() {
// pickedPhotoView can be accessed here
}
}
<小时/>
UITableViewCell
和UICollectionViewCell
不应访问UIViewController
中的成员变量。那些单元格应该专注于他们的UI表示,并且不应该涉及任何关于它的父视图控制器的知识。
通过这种方式,这些单元格可以轻松地在另一个UIViewController中重用。那些UIViewController只知道他们何时想要使用ImagesCell
,他们MUST
实现ImageCellDelegate
协议。
答案 3 :(得分:0)
解决方案是:
class TwoViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, ImagesCellDelegate {
func doSomething(_ sender: ImagesCell) {
print("do something")
}
var imagesCell: ImagesCell = ImagesCell()
override func viewDidLoad() {
super.viewDidLoad()
imagesCell.delegate = self
}
}
protocol ImagesCellDelegate {
func doSomething(_ sender: ImagesCell)
}
class ImagesCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var delegate: ImagesCellDelegate!
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
delegate?.doSomething(self)
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// just added this code in function
cell.delegate = self
}