在UICollectionViewReusableView标头中访问UIViews的委托方法

时间:2014-07-06 11:13:06

标签: ios objective-c uiview uicollectionview

在UICollectionView中创建标题会变得比在表格中更难。

我将UICollectionViewReusableView子类化,在UICollectionView中注册了它的类,实现了collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath。在我的标题视图中,我有两个UITextField'一个UITextView。我需要访问他们的委托方法(编辑开始,完成...)。使用this example我看到你可以这样做:

UICollectionReusableView *footer = (UICollectionReusableView*)[self.collectionView viewWithTag:999];
UILabel *footerLabel = (UILabel*)[footer viewWithTag:100];

但为每个委托方法创建许多变量似乎是错误的。我需要能够在那些文本字段和文本视图中设置文本。有没有更好的方法呢?

//...viewDidLoad
UICollectionView *images = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:layout];
[images registerClass:[ImagesCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[images registerClass:[HeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerView"];
//images data source and delegate

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
    if (kind == UICollectionElementKindSectionHeader) {
        HeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerView" forIndexPath:indexPath];
        if (!headerView)
            headerView = [[HeaderView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)];
            headerView.delegate = self;
        return headerView;
    }
    return nil;
}

然后我使用带标签的转换来获取视图。有没有其他方法来更新标题内的各个视图?

更新:

HeaderView.h

@protocol HeaderViewDelegate <NSObject>

- (void)headerView:(id)view didBeginEditingFullName:(UITextField *)fullNameTextField;
- (void)headerView:(id)view didEndEditingFullName:(UITextField *)fullNameTextField;
- (void)headerView:(id)view didBeginEditingBreed:(UITextField *)breedTextField;
- (void)headerView:(id)view didEndEditingBreed:(UITextField *)breedTextField;
- (void)headerView:(id)view didBeginEditingDescription:(UITextView *)descriptionTextView;
- (void)headerView:(id)view didEndEditingDescription:(UITextView *)descriptionTextView;

@end

@interface HeaderView : UICollectionReusableView {
    id <HeaderViewDelegate> delegate;
}
@property (nonatomic, weak) id <HeaderViewDelegate> delegate;

这就是我设置HeaderView.h的方法......在方法中必须使用id而不是(HeaderView *) ...我收到了错误。

这是我在PersonalViewController.m页面中的内容之前:

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    if (textField == _fullName) {

    }else if (....)
}

现在_fullName在补充视图中,我无法访问它。这就是我想要达到的目标......

将其更改为:

- (void)headerView:(HeaderView *)view didBeginEditingFullName:(UITextField *)fullName{
    NSLog (@"here");
}

没有日志输出。我在HeaderView.m中为视图设置了委托。该死的,我到底在哪里?

更新:

HeaderView.h与以前相同。我添加了textfield和textview委托给它。 HeaderView.m:

@implementation HeaderView

@synthesize delegate=_delegate;

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        UITextField *fullName = [[UITextField alloc]initWithFrame:CGRectMake(5, 100, 120, 21)];
        fullName.tag = 4;
        fullName.delegate = self;
        _fullName = fullName;
        [self addSubview:_fullName];
    }
}

PersonalViewController.m是一样的。 viewForSupplementaryElementOfKind仍然与以前相同......设置headerView.delegate = self;。在其中我打电话

- (void)headerView:(HeaderView *)view didBeginEditingFullName:(UITextField *)fullName{
    NSLog(@"here");
}

我应该在HeaderView.m中调用它吗?我需要从PersonalViewController.m中调用它...

1 个答案:

答案 0 :(得分:1)

每次滚动单元格时,您必须了解可重用单元格被破坏并重新初始化。

我会为你的补充视图创建一个子类(就像你已经做过的那样),将所有texfields作为属性(你也这样做了)。另外,我会为您的自定义补充单元创建一个协议:

@protocol HeaderViewDelegate <NSObject>
    -(void)headerView:(HeaderView*)view didBeginEditingFirstTextField:(UITextField*)firstTextField;
    -(void)headerView:(HeaderView*)view didBeginEditingSecondTextField:(UITextField*)secondTextField;
    -(void)headerView:(HeaderView*)view didBeginEditingTextView:(UITextView*)textView;
@end

然后实现委托模式:

headerView.delegate = self;

等等。

提示:如果您想区分单元格的子视图并通过indexPath访问它们,您仍然可以使用不带任何额外变量的标记,只需在此公式中初始化每个标记:

tag = indexpath.hash + subviewIndex

subviewIndex - 只是您手动设置的订单号,对于您单元格的每个子视图,它必须是唯一的。 (在您的示例中,第一个文本字段为1,第二个为2,textview为3)。