Ios 在customCell中访问navigationController

Ios 在customCell中访问navigationController,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我有一个带有customCells的collectionView,在第一个(indexPath 0)中,我有一个按钮 我希望在单击它时进入另一个ViewController,但我无法访问navigationController,因为我的单元格是UICollectionViewCell 我如何才能访问导航控制器?您可以在当前视图控制器中,在CollectionViewDataSource方法cellForItemAtIndexPath中,以这种方式为该单元格设置按钮操作 cell.btnAdd.

我有一个带有customCells的
collectionView
,在第一个(indexPath 0)中,我有一个
按钮

我希望在单击它时进入另一个ViewController,但我无法访问
navigationController
,因为我的单元格是
UICollectionViewCell


我如何才能访问
导航控制器

您可以在当前
视图控制器
中,在
CollectionViewDataSource
方法
cellForItemAtIndexPath
中,以这种方式为该单元格设置
按钮
操作

cell.btnAdd.addTarget(self, action: #selector(self.buttonClicked(_:)), forControlEvents: .TouchUpInside)
然后在
ViewController

func buttonClicked(sender: UIButton) {
    //perform navigation now
}
为单元格创建委托协议和属性 一个很好的选择是为
UICollectionViewCell
子类创建委托协议和委托属性

该协议明确了计算单元如何将其需求反馈给相关方(而不是在类的外部某处设置按钮的目标/操作),并为将来扩展这种通信创建了一个区域

此外,如果您需要添加与单元格委托的更多通信,您所要做的就是添加一个新的必需或可选方法,而不必连接其他任何内容,这样做的另一个好处是,cell类的用户可以查看协议声明并立即知道cell如何与另一个对象通信,而无需知道大量私有实现细节,如按钮的存在等。连接按钮可能是目前最短的路径,但最终这不是很好的编码实践,也没有遵循关注点分离的概念

对于特定的单元格类型,委托属性可能非常简单,例如(Objective-C):

@protocol AddRecipeCollectionViewCellDelegate
@必需的
-(void)cellDidRequestAddRecipeAction:(AddRecipeCollectionViewCell*)单元格;
@结束
@接口AddRecipeCollectionViewCell:UICollectionViewCell
@属性(弱、非原子)id委托;
@结束

(注意:此处需要Swift代码,我将用Swift等价物更新答案,但我需要研究语法,因为我不是每天都使用它,如果您先找到它,任何其他人都可以免费为这个答案提供Swift等价物)

不访问导航控制器是什么意思?您需要让按钮调用类中负责显示
UICollectionView
的方法。单击“添加”按钮时要转到下一个VC吗?如果我使用自定义数据源类怎么办?我没有访问NavigationController的权限。@我不明白您的问题。您能提供更多详细信息吗?如果CollectionViewDataSource的实现是在单独的类中完成的,该怎么办?如何执行导航?
@protocol AddRecipeCollectionViewCellDelegate <NSObject>

@required
- (void)cellDidRequestAddRecipeAction:(AddRecipeCollectionViewCell *)cell;

@end

@interface AddRecipeCollectionViewCell : UICollectionViewCell

@property (weak, nonatomic) id<AddRecipeCollectionViewCellDelegate> delegate;

@end