CollectionView 2部分。如何在swift中从内部类访问插座变量

时间:2018-04-25 00:24:36

标签: ios swift xcode collectionview

我的收藏夹视图中有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
}

4 个答案:

答案 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
    }
}

<小时/>

更多

UITableViewCellUICollectionViewCell不应访问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
    }