我有collectionView
和customCells,在第一个(indexPath 0)我有一个Button
。
我希望当我点击它时,我会进入另一个ViewController但我无法访问navigationController
,因为我的单元格是UICollectionViewCell
。
如何获取对navigationController
的访问权限?
答案 0 :(得分:1)
您可以通过这种方式为该单元格的Button
方法ViewController
内的当前CollectionViewDataSource
实际设置cellForItemAtIndexPath
操作。
cell.btnAdd.addTarget(self, action: #selector(self.buttonClicked(_:)), forControlEvents: .TouchUpInside)
之后在ViewController
func buttonClicked(sender: UIButton) {
//perform navigation now
}
答案 1 :(得分:0)
一个很好的选择是为UICollectionViewCell
子类创建委托协议和委托属性。
该协议清楚地说明了小区如何将其需求传达给感兴趣的一方(而不是将一个按钮的目标/动作设置在该类的外部某处)并创建一个区域来扩展该通信。将来
此外,如果您需要添加与单元代理的更多通信,您所要做的就是添加一个新的必需或可选方法,而不必连接任何其他方法,这样做的额外好处是单元类的用户可以查看协议的声明,并立即知道单元如何与另一个对象通信,而不必知道一堆私有实现细节,例如按钮的存在等。连接按钮可能是目前最短的路径,但最终不是很好的编码实践,也不遵循分离关注的概念。
对于特定的单元格类型,委托属性可能非常简单,例如(Objective-C):
@protocol AddRecipeCollectionViewCellDelegate <NSObject>
@required
- (void)cellDidRequestAddRecipeAction:(AddRecipeCollectionViewCell *)cell;
@end
@interface AddRecipeCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) id<AddRecipeCollectionViewCellDelegate> delegate;
@end
(注意:这里需要Swift代码,我将使用Swift等效更新答案,但我需要研究语法,因为我不会每天都使用它,其他人都可以随意使用如果你先得到它,可以提供相当于这个答案的Swift)