gpt4 book ai didi

ios - 协议(protocol)和委托(delegate)不适用于 UICollectionReusableView

转载 作者:行者123 更新时间:2023-11-29 12:09:43 25 4
gpt4 key购买 nike

我有一个启用了节页脚的 UICollectionView。我创建了一个 UICollectionReusableView 的自定义子类,名为 LeafletFooterView 并声明了一些 IBOutletIBAction:

- (IBAction)dropboxButton:(id)sender;
- (IBAction)soundcloudButton:(id)sender;

在我的 UICollectionViewClass 中,我有:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
UICollectionReusableView *reusableview = nil;

if (kind == UICollectionElementKindSectionFooter) {
UICollectionReusableView *footerview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath];

reusableview = footerview;
}

return reusableview;
}

LeafletFooterView 类的 IBAction 中,我只是想呈现另一个 viewController:

- (IBAction)dropboxButton:(id)sender
{
VideoWebViewController *video = [[VideoWebViewController alloc] init];
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:video];

[self presentViewController:navigation animated:YES completion:nil];

[video setSelectedVideo:@"https://www.dropbox.com/"];
}

错误是:

No visible @interface for 'LeafletFooterView' declares the selector 'presentViewController:animated:completion'. 

我已经在 IBAction 方法中尝试了 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"www.dropbox.com"]]; ,虽然现在有没有错误,点击它不会打开带有该网站的 Safari。该方法肯定会被调用; NSLogBreakpoint 证明了这一点。

更新

所以在这不起作用之后,我尝试完成为此声明委托(delegate)的过程,与这个问题的方式大致相同:Present view controller from NSObject subclass .

这是我的 LeafletFooterView:

@class LeafletFooterView;
@protocol FooterViewDelegate <NSObject>
-(void)rowTapped;
@end
@interface LeafletFooterView : UICollectionReusableView
@property (weak, nonatomic) IBOutlet UILabel *label;
- (IBAction)dropboxButton:(id)sender;
@property(nonatomic,assign)id<FooterViewDelegate> delegate;

The LeafletFooterView.m is here: - (IBAction)dropboxButton:(id)sender
{
NSLog(@"Dropbox");
[self.delegate rowTapped];
}

现在在我的 LeafletCollectionViewController 中,我有:

- (void)rowTapped
{
NSLog(@"Is this getting called?");
VideoWebViewController *video = [[VideoWebViewController alloc] init];
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:video];

[self presentViewController:navigation animated:YES completion:nil];

[video setSelectedVideo:@"https://www.dropbox.com/"];

}

当我运行这段代码时,这个方法实际上从未被调用过。 LeafletCollectionView 设置为使用 FooterViewDelegate。在 LeafletCollectionViewviewWillAppear 中,我尝试了以下操作:

LeafletFooterView *footer = [[LeafletFooterView alloc] init];
footer.delegate = self;

rowTapped 方法实际上从未被调用过。

用户应该能够点击 LeafletFooterView 中的 UIButton 并显示 UIViewController。我该如何实现这一目标?任何指导将不胜感激。

最佳答案

您需要在 dataSource 所在的位置显示 UINavigationController。因此,如果您尝试删除 IBAction,而是以编程方式将方法添加到数据源要显示 VideoWebViewController 的位置。

然后在您的 viewForSupplementaryElementOfKind 方法中,您将访问按钮并触发该方法。所以我突然想到了(有一段时间没有使用 objC):

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
UICollectionReusableView *reusableview = nil;

if (kind == UICollectionElementKindSectionFooter) {
LeafletFooterView *footerview = (LeafletFooterView *)[collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath];
[footerView.dropboxButton addTarget:self
action:@selector(dropboxTapped:)
forControlEvents:UIControlEventTouchUpInside];

reusableview = footerview;
}

return reusableview;
}

-(void)dropboxTapped:(id)sender{
// Present the controller here
}

希望对您有所帮助:)

编辑:更新您的问题后,我发现您走了一条不同的路线。您只需要为 footerView 设置委托(delegate),如下所示:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
UICollectionReusableView *reusableview = nil;

if (kind == UICollectionElementKindSectionFooter) {
LeafletFooterView *footerview = (LeafletFooterView *)[collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath];
[footerView.dropboxButton addTarget:self
action:@selector(dropboxTapped:)
forControlEvents:UIControlEventTouchUpInside];
footerView.delegate = self
reusableview = footerview;
}

return reusableview;
}

此外,不要忘记像我在代码中使用 (LeafletFooterView *) 那样将 View 转换为 LeafletFooterView 我希望它能工作:)

关于ios - 协议(protocol)和委托(delegate)不适用于 UICollectionReusableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33826597/

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