swift - 如何从其他自定义 UICollectionViewCell 引用 UICollectionView

标签 swift uicollectionview uicollectionviewcell awakefromnib

我有一个 UIViewController,它有一个带有 4 个自定义单元格的 UICollectionView。在其中一个单元格中,我有一个 UIButton,点击它时需要访问另一个单元格,以更新 UIImage。如何在 UIViewController 中引用 collectionView 引用以将其传递给其他 NIB?

//CollectionView
@IBOutlet weak var collectionView: UICollectionView!

我是否需要在override func awakeFromNib()中添加一些内容以引用其他单元格?

示例:

let myCell = collectionView!.cellForItem(at: myIndexPath) as! MainCollectionViewCell

如何从其他 NIB 引用 collectionView

谢谢

最佳答案

从架构的角度来看,答案是“你不需要”。

正确的答案是拥有一个 Model 类,可能具有代表模型不同部分的属性。当用户点击按钮时,它会以某种方式影响模型(按钮操作应该调用模型对象上的方法。方法的名称应该对应用程序的用户有意义。)

当模型改变状态时,它应该通知所有观察者。查找观察者模式,但基本上,它就像一个委托(delegate)数组。

应将包含 UIImage 的单元格设置为观察模型并对模型中的更改使用react,在本例中,模型中的更改恰好是由于按钮点击造成的,但也可能通过其他方式发生。

首先你需要一个模型类:

class MyModel {
    typealias Observer = (MyModel) -> Void

    func add(observer: @escaping Observer) {
        observers.append(observer)
    }

    func updateImage() {
        // do what you need to do to update `myImage`
        // then call:
        update()
    }

    private (set) var image: UIImage?
    private var observers = [Observer]()

    private func update() {
        for each in observers {
            each(self)
        }
    }
}

然后在 View Controller 中创建该模型的实例:

let model = MyModel()

现在将 View Controller 的模型传递给 cellForItemAt 方法内的每个单元格。

cell.model = model

在包含图像的单元格中,为其指定一个模型属性,如下所示:

var model: MyModel! {
    didSet {
        model.add(observer: { [weak self] updated in 
            self?.imageView.image = updated.image
        })
    }
}

具有按钮的单元格将具有普通模型属性,并且在按钮的 IBAction 中,您将调用 model.updateImage()

var model: MyModel!

@IBAction func buttonTapped(_ sender: Any) {
    model.updateImage()
}

关于swift - 如何从其他自定义 UICollectionViewCell 引用 UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46720757/

相关文章:

arrays - 修改字典数组内部的字典属性。错误: Cannot assign to immutable expression of type [String:AnyObject]

ios - UICollectionView 委托(delegate)未被调用

ios - UICollectionViewCell 和 UICollectionReusableView 有什么区别?

Swift 2.2 单播放/暂停 UIButton

swift - 为什么我的 UIAlert 上的按钮重复?

ios - 由于 PanGesture,快速获取 EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0x0)

ios - UICollectionView 不呈现所有行

ios - 滚动后重置 UICollectionViewCell 中的 Scrollview

ios - 在 UICollectionViewCell 中添加带计时器的倒计时标签的最佳方法,即使在单元格被重用后也能正常工作

swift - XCode 不断给我 "fbsdkcorekit/fbsdkcorekit.h not found",即使它在项目中。