gpt4 book ai didi

ios - UICollectionCell 调用 CollectionViewController 中的方法

转载 作者:可可西里 更新时间:2023-11-01 05:01:43 26 4
gpt4 key购买 nike

我有一个包含 Collection View 的标准 View Controller 。

我正在使用从 UICollectionViewCell 的自定义子类创建的自定义单元格填充 Collection View 。

  1. 从 Collection View 单元类中调用 Collection View 类中方法的最佳实践是什么

  2. 为什么在我的 Collection View 单元格类中没有调用以下 init,我认为这会在 collectionView 类创建我的单元格时调用。

    (id)initWithFrame:(CGRect)frame

我想这样做的原因是因为我正在删除一个 Collection View 单元格,删除函数在 Collection View 单元格类中。我想在删除时播放声音,并且宁愿在 Collection View Controller 类中初始化声音,而不是为每个单元格初始化声音。

最佳答案

你真的不应该添加从单元格到 CollectionView 的反向引用作为 iVar 或属性,因为你最终会得到一个非常(非常)糟糕的交叉引用(objA 指向 objB 而 objB 指向对象A)。除了像编译错误这样的小问题(可以用 @class 语句严重修复),这还会导致严重的问题,比如不可释放的对象、内存泄漏、僵尸等等。

经验法则是:

parents know about their children, but children must not know about their parents.

换句话说:CollectionView 知道它的单元格,但单元格不应该知道它们的 CollectionView。

可能的解决方案

  1. 重新设计您的任务和解决方案。也许在 collectionView 而不是单元格上添加一个点击手势识别器。有 -indexPathForItemAtPoint: 给你选择的单元格。

  2. 如果您绝对需要反向引用:定义协议(protocol)并使用委托(delegate)。这是 Cocoa/Cocoa Touch 中常见的设计模式。您应该阅读委托(delegate)设计模式,但简而言之,这就是您的做法:


在你的单元格中定义协议(protocol)(记住,单元格不知道父级的类型,通过定义这个协议(protocol),它只是确定“父级”上有一个或多个可用的方法)

// in cell.h
@protocol MyCellProtocol
- (IBAction)doSomething:(id)sender;
@end

添加一个 id 类型的委托(delegate)(这意味着,它可以是任何对象,只要它符合协议(protocol)。换句话说:这将是你的 collectionView,但你不需要引用它!

// in cell.h
@property (assign) id<MyCellProtocol> cellDelegate;

现在您可以在您的单元格中调用委托(delegate):

// in cell.m, some method:
[self.cellDelegate doSomething:nil];

最后您需要设置委托(delegate)。在 UICollectionViewController 中创建/设置单元格时,将 Controller 设置为委托(delegate):

// in collectionViewController.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell =
[self.collectionView dequeueReusableCellWithReuseIdentifier:@"myCell"
forIndexPath:indexPath];
cell.cellDelegate = (id<MyCellProtocol>)self;

关于ios - UICollectionCell 调用 CollectionViewController 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18823679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com