如何从单元格的单元格中调用父视图控制器中的方法?

时间:2017-02-05 23:21:46

标签: objective-c uitableview delegates protocols

我的应用程序结构目前看起来像这样: 集合视图控制器 - >其中包含表视图的通用单元格 - >个体细胞。

我想从一个单独的单元格中调用集合视图控制器中的方法。到目前为止,我已经在单个单元格中实现了一个委托,但是如果我似乎无法在集合视图控制器中设置我的委托,因为我没有它的实例。

此外,我在表视图中有几个访问集合视图控制器中的方法所需的单元格。

2 个答案:

答案 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];
}