在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中调用它...
答案 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)。