我的应用程序结构目前看起来像这样: 集合视图控制器 - >其中包含表视图的通用单元格 - >个体细胞。
我想从一个单独的单元格中调用集合视图控制器中的方法。到目前为止,我已经在单个单元格中实现了一个委托,但是如果我似乎无法在集合视图控制器中设置我的委托,因为我没有它的实例。
此外,我在表视图中有几个访问集合视图控制器中的方法所需的单元格。
答案 0 :(得分:1)
responder chain可以提供帮助。
视图可以向响应者链查询可以接受消息的第一个目标。假设消息为-fooBar
,则视图可以使用方法-[UIResponder targetForAction:sender:]
// find the first responder in the hierarchy that will respond to -fooBar
id target = [self targetForAction:@selector(fooBar) sender:self];
// message that target
[target fooBar];
请注意,此通信由此方法控制:
(BOOL)canPerformAction:(SEL)action
withSender:(id)sender;
如果响应者类实现了请求的操作,则此方法的此默认实现返回YES,如果不执行,则调用下一个响应者。
默认情况下,响应该消息的第一个对象将成为目标,因此如果某些视图或视图控制器需要,您可能希望覆盖canPerformAction:withSender:
。
答案 1 :(得分:0)
为此你可以这样做:
在集合视图控制器中 - > .h
档案
@interface CollectionViewController : UICollectionViewController<ColectionCellDelegate>
@end
在集合视图控制器中 - &gt; .m
档案
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [self.collectionData count];
}
// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionCell" forIndexPath:indexPath];
cell.cellData = [self.collectionData objectAtIndex:indexPath.row];
cell.delegate = self;
return cell;
}
-(void)tableCellDidSelect:(UITableViewCell *)cell{
NSLog(@"Tap %@",cell.textLabel.text);
DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
detailVC.label.text = cell.textLabel.text;
[self.navigationController pushViewController:detailVC animated:YES];
}
在CollectionCell.h
@class CollectionCell;
@protocol ColectionCellDelegate
-(void)tableCellDidSelect:(UITableViewCell *)cell;
@end
@interface CollectionCell : UICollectionViewCell<UITableViewDataSource,UITableViewDelegate>
@property(strong,nonatomic) NSMutableArray *cellData;
@property(weak,nonatomic) id<ColectionCellDelegate> delegate;
@end
在CollectionCell.m
@implementation CollectionCell
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.cellData = [[NSMutableArray alloc] init];
}
return self;
}
-(void) awakeFromNib{
[super awakeFromNib];
self.cellData = [[NSMutableArray alloc] init];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.cellData count];
}
// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"TableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
cell.textLabel.text = [self.cellData objectAtIndex:indexPath.row];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[[self delegate] tableCellDidSelect:cell];
}