【问题标题】:Can't assign delegate methods to UIViews?不能将委托方法分配给 UIViews?
【发布时间】:2023-04-10 13:21:01
【问题描述】:

我定义了一个简单的 CollectionView 视图,

当我将委托方法放在 ViewController 中时,单元格会正确显示。但是,当我将它移到 UIView 时,没有调用任何委托方法。

有人知道为什么吗?附上代码。

在 ViewController 中,viewDidLoad 方法,

self.userGrid = [[UserGrid alloc] initWithFrame:self.view.frame];

UserGrid.h

#import <UIKit/UIKit.h>
#import "AvatarViewCell.h"
#import "GridViewLayout.h"

@interface UserGrid : UIView <UICollectionViewDelegate, UICollectionViewDataSource>

@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;

@end

和 UserGrid.m

#import "UserGrid.h"

@implementation UserGrid

- (id)initWithFrame:(CGRect)aRect
{
    UINib *cellNib = [UINib nibWithNibName:@"AvatarViewCell" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"avatarCell"];

    if ((self = [super initWithFrame:aRect])) {
        self.collectionView.dataSource = self;
        self.collectionView.delegate   = self;

        [self.collectionView registerClass:[AvatarViewCell class] forCellWithReuseIdentifier:@"avatarCell"];
    }
    return self;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 12;
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"avatarCell";

    AvatarViewCell *avatarCell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    [avatarCell.avatarImageView setImage:[UIImage imageNamed:[NSString stringWithFormat:@"website_%ld.jpg", indexPath.row + 1]]];

    return avatarCell;
}

@end

** 编辑

我将初始化部分更改为(在 viewDidLoad 中),

self.userGrid = [[[NSBundle mainBundle] loadNibNamed:@"UserGrid" owner:nil options:nil] lastObject];
self.userGrid.frame = self.view.frame;

在 viewDidAppear 中添加,

- (void)viewDidAppear:(BOOL)animated {
    [self.userGrid.collectionView reloadData];
}

添加了 awakeFromNib 方法,但是没有调用委托方法……嗯

- (void)awakeFromNib {
    UINib *cellNib = [UINib nibWithNibName:@"AvatarViewCell" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"avatarCell"];

    NSLog(@"awake");
    self.collectionView.dataSource = self;
    self.collectionView.delegate   = self;

    [self.collectionView registerClass:[AvatarViewCell class] forCellWithReuseIdentifier:@"avatarCell"];
}

【问题讨论】:

  • 在分配委托时检查 initwithFrame 集合视图是否已初始化
  • @AhmadIshfaq 嗯,我有一个 xib 文件,所以它被初始化了.. 否则我猜它会崩溃......
  • 只需放置一个断点并检查它是否为零尝试将这些所有语句放入 awakefromnib() 函数中
  • @AhmadIshfaq awakefromnib 未被调用。我添加了 NSLog 来验证...
  • 如果您的视图与 xib 相关联,我认为这就是您的问题所在。

标签: ios objective-c uiview


【解决方案1】:

像这样初始化 UserGrid 视图

    self.userGrid=[[[NSBundle mainBundle] loadNibNamed:@"yourxibName" owner:nil options:nil] lastObject];
    self.userGrid.frame=self.view.frame;

您有一个 collectionview 的 IBOutlet,但尚未将视图附加到您的类,因此不会初始化集合

【讨论】:

  • 在 viewdidappear 的控制器中尝试一个collectionview重新加载它是否工作
  • 应该可以,检查collectionview的出口是否连接
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多