Ios Objective-C错误:使用NSArray的单元格上的IndexPath错误
我通过Swift Bridgeting在我的代码中使用CollectionView 目标C(不工作) 我的问题是IndexPath返回错误的Ios Objective-C错误:使用NSArray的单元格上的IndexPath错误,ios,objective-c,swift,uicollectionview,uicollectionviewcell,Ios,Objective C,Swift,Uicollectionview,Uicollectionviewcell,我通过Swift Bridgeting在我的代码中使用CollectionView 目标C(不工作) 我的问题是IndexPath返回错误的项索引。以下是最低限度的代码: - (void)viewDidLoad { [super viewDidLoad]; self.collectionViewEvents.collectionViewLayout = [[CardsCollectionViewLayout alloc] init]; self.collectionVi
项
索引。以下是最低限度的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.collectionViewEvents.collectionViewLayout = [[CardsCollectionViewLayout alloc] init];
self.collectionViewEvents.dataSource = self;
self.collectionViewEvents.delegate = self;
self.collectionViewEvents.pagingEnabled = YES;
self.collectionViewEvents.showsHorizontalScrollIndicator = NO;
[self load];
}
// Issue visible here, the indexPath.item is not correct
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
for (UICollectionViewCell *cell in self.collectionViewEvents.visibleCells) {
NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell];
NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item);
return;
}
}
- (void)load
{
// self.eventData is declares as: @property (nonatomic) NSArray *eventData;
self.eventData = [[NSArray alloc] initWithObjects:UIColor.blackColor, UIColor.whiteColor, UIColor.brownColor, nil];
[[self collectionViewEvents] reloadData];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCellReuseIdentifier"
forIndexPath:indexPath];
cell.layer.cornerRadius = 7.0;
cell.backgroundColor = UIColor.blackColor;
return cell;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return self.eventData.count;
}
结果(注意第一个和第二个单元格如何具有相同的indexath项):
斯威夫特(工作) 我从他的代码库中进行了尝试,它静态地声明了
colors
:
var colors: [UIColor] = [
UIColor(red: 237, green: 37, blue: 78),
UIColor(red: 249, green: 220, blue: 92),
UIColor(red: 194, green: 234, blue: 189),
UIColor(red: 1, green: 25, blue: 54),
UIColor(red: 255, green: 184, blue: 209)
]
...
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCellReuseIdentifier", for: indexPath)
cell.layer.cornerRadius = 7.0
cell.backgroundColor = .black
return cell
}
在实现下面的代码之后,它将返回正确的indexath
// Issue NOT visible here, the indexPath.item IS correct
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
for cell in collectionView.visibleCells {
let indexPath = collectionView.indexPath(for: cell)
print(indexPath?.item)
return
}
}
结果:
2020-03-19 14:48:05.334905+0100 App[7422:2617858] Visible Cell IndexPath Item 2 # => 3rd cell
2020-03-19 14:48:05.741805+0100 App[7422:2617858] Visible Cell IndexPath Item 1 # => 2nd cell
2020-03-19 14:48:06.184932+0100 App[7422:2617858] Visible Cell IndexPath Item 0 # => 1st cell
我在我的Objective-C
代码中做错了什么
我尝试过的事情
问题是在这个循环中有一个返回
for (UICollectionViewCell *cell in [[self collectionViewEvents] visibleCells]) {
NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell];
NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item);
return; // <- This here
}
for(UICollectionViewCell*位于[[self-collectionViewEvents]visibleCells]中的单元格){
nsindepath*indepath=[[self-collectionViewEvents]indexPathForCell:cell];
NSLog(@“可见单元格indexath项%ld”,indexath.Item);
return;//检查答案我认为您的问题是您没有将数据源设置为您的集合view@Was“Siimbenhsen为您的评论添加了澄清,并修复了Swift代码。我不想设置backgroundColor
,而是想获得正确的IndexPath.item
和in-Objective-C代码。您尝试过使用[[self collectionViewEvents]indexPathsForVisibleItems]
?可能是indexPaths尚未更新的情况下,您可能需要将for
循环排队到主队列的末尾(dispatch\u async(dispatch\u get\u main\u queue(),^{for…})
).@AlejandroIván刚刚试过,检查问题的结尾。没有帮助。当你在单元格上循环时,你可以尝试打印单元格本身吗?我现在能想到的唯一解释是,当你在单元格上迭代时,可见单元格会因某种原因发生变化,但似乎不太可能。返回必须在那里。代码与Swift相同示例(我实际上希望在第一项中尽早返回)。问题在于不同卡片上的索引错误,使用相同的Objective-C和Swift代码。请参阅我再次发布的示例。
// 1st cell has index 1, instead of 0
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
for (UICollectionViewCell *cell in [[self collectionViewEvents] visibleCells]) {
NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell];
NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item);
return;
}
// 1st cell has index 1, instead of 0
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSArray *visible = [self.collectionViewEvents indexPathsForVisibleItems];
NSIndexPath *indexPath = [visible firstObject];
NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item);
return;
// Calling it in main thread, same result
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_main_queue(), ^{
for (UICollectionViewCell *cell in [[self collectionViewEvents] visibleCells]) {
NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell];
NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item);
return;
}
});
for (UICollectionViewCell *cell in [[self collectionViewEvents] visibleCells]) {
NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell];
NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item);
return; // <- This here
}