- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含 Collection View 的标准 View Controller 。
我正在使用从 UICollectionViewCell
的自定义子类创建的自定义单元格填充 Collection View 。
从 Collection View 单元类中调用 Collection View 类中方法的最佳实践是什么
为什么在我的 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。
可能的解决方案
重新设计您的任务和解决方案。也许在 collectionView 而不是单元格上添加一个点击手势识别器。有 -indexPathForItemAtPoint: 给你选择的单元格。
如果您绝对需要反向引用:定义协议(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/
我正在尝试使用 UIView 制作动画但我想做的所有事情都是徒劳的。我需要 CollectionView Cells 应该在每隔固定秒数后自动水平滑动。 请帮我解决这个问题,因为这是我的应用等待发布的
CollectionView 单元格未到达正确位置。我正在使用以下代码创建 Collection View let layout: UICollectionViewFlowLayout = UICo
基本上我有一个带有 UICollectionView 和 UIPickerView 的类设置。正如我现在所拥有的,当用户单击单元格内的按钮时,选择器会弹出。我想做的是,当用户从选择器中选择某些内容时,
伙计们,我想像这样更改单元格的大小 自动调整到文本。我能做到的是 我试过搜索但无法找到解决方案。我怎样才能使它动态化为文本。标签来自模型类,颜色和背景从单元格的自定义类改变。 最佳答案 它在下面的答案
当我尝试将 UICollectionCell 放入 Interface Builder 中的 UICollectionView 时,由于未知原因我无法放置它。该单元格将转到工具栏而不添加到 UICol
我用过CHTCollectionViewWaterfallLayout .我所做的是在 cellForItemAtIndexPath 中加载图像通过发送异步请求使用 block 。这里一切都很好,但我
我想从 UICollectionView 中的 UICollectionViewCell 执行序列。有一个 UIIMage 是 UICollectionView 的 subview 。有一个按钮是 U
我有一个 UICollectionViewCell ,其中包含具有渐变的图像和按钮。当我滚动时 - 我有一个错误:渐变是在图像上使用新图层绘制的,并且按钮中的文本消失了。当我向后滚动时会发生这种情况。
我有一个包含 Collection View 的标准 View Controller 。 我正在使用从 UICollectionViewCell 的自定义子类创建的自定义单元格填充 Collectio
我是移动领域开发的新手,我对我的项目有一个架构问题: 自定义 UICollectionViewCell 的正确位置在哪里? 本能地,我会把它放在 (V)view 下。 编辑 我会这样使用它: func
我有一个 UICollectionView 将图片作为其数据存储中的元素。 我只想在相应的 UICollectionViewCell 当前显示在屏幕上时才将高分辨率图片加载到元素中。稍后,当 UICo
背景: 我正在使用嵌套的 UICollectionViews 构建日历 View 。 用户在月份之间水平滚动,月份单元格高度由天数或天行数设置。 问题: 当月份单元格高度设置为低于 100 像素时,我
我在 UICollectionViewCell 中有一个函数需要访问托管 UIViewController。目前无法访问“makeContribution()”: 访问具有所需功能的主机 UIView
编辑:似乎与 this 相同的问题 我使用自定义布局和单元格制作了 Collection View ,但我的单元格位置有点偏离,所以我决定对它们进行编号,以便我可以更轻松地调试它。我关注了这个人的an
我仔细地查看了这是什么类型的 UIActionSheet 的名称。 或者如果它甚至是完全定制的。有了取消按钮,就好像它是一个 UIActionSheet,它上面的部分是一个 UICollectionV
我是一名优秀的程序员,十分优秀!