gpt4 book ai didi

ios - 在 UICollectionViewReusableView header 中访问 UIViews 的委托(delegate)方法

转载 作者:行者123 更新时间:2023-11-29 02:50:31 24 4
gpt4 key购买 nike

事实证明,在 UICollectionView 中制作标题比在表格中制作标题要难得多。

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

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

但是为每个委托(delegate)方法创建那么多变量似乎是错误的。我需要能够在这些文本字段和 TextView 中设置文本。有更好的方法吗?

//...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;
}

然后我使用带有标签的转换来获取 View 。有没有其他方法可以更新 header 内的各个 View ?

更新:

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 在补充 View 中,我无法访问它。这就是我想要达到的目标......

改成这样:

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

没有日志输出。我为 HeaderView.m 中的 View 设置委托(delegate)。该死的,我在这里有什么不明白的?

更新:

HeaderView.h 与之前相同。我向其中添加了文本字段和 TextView 委托(delegate)。标题 View .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 中调用它...

最佳答案

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

我会为您的补充 View 创建一个子类(就像您已经做的那样),将所有 texfields 作为属性(您也这样做了)。此外,我会为您的自定义补充细胞创建一个协议(protocol):

@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

然后实现委托(delegate)模式:

headerView.delegate = self;

等等。

提示:如果你想区分单元格的 subview 并通过 indexPath 访问它们,你仍然可以使用没有任何额外变量的标签,只需在这个公式上初始化每个标签:

tag = indexpath.hash + subviewIndex

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

关于ios - 在 UICollectionViewReusableView header 中访问 UIViews 的委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24595216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com