【发布时间】: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