在点击UIBarButtonItem时从indexPath获取UICollectionViewCell

时间:2017-03-08 14:10:52

标签: ios objective-c uicollectionview uicollectionviewcell uibarbuttonitem

我创建了一个带有导航栏和UiCollectionView的视图控制器。 UI集合视图包含自定义UICollectionViewCell。导航栏包含两个UIBarButton项目,一个位于左上角 - 准备了segue到上一页,其他项目位于右上角 - 用于删除UI CollectionView中的单元格,如下图所示:

Main Screen

  现在我想在右上角的UIBarButtonItem被轻击时删除所选的UICollectionViewCell。

这是我的cellForItemAtIndexPath方法的样子:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath{
self.GlobalIndexPath = indexPath;
MessagesCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"messagesCell" forIndexPath:indexPath];
cell.MessageHeading.text = [self.Message_Heading objectAtIndex:indexPath.row];
cell.MessageSubject.text = [self.Message_Subject objectAtIndex:indexPath.row];
cell.MessageContent.text = [self.Message_Details objectAtIndex:indexPath.row];
[cell.Checkbox setHidden:YES];
[cell.Checkbox setChecked:NO];
}

我尝试了将Indexpath声明为全局变量的解决方案,并在按钮事件中使用它,如下所示:

@property (strong,nonatomic) NSIndexPath *GlobalIndexPath;
some other code .......

//When Bin Icon(UIBarButtonItem) Clicked
- (IBAction)DeleteMessages:(id)sender {

[self.view makeToast:@"You clicked delete button !"];

NSIndexPath *indexPath = [self.MessageCollectionView.indexPathsForVisibleItems objectAtIndex:0] ;
BOOL created = YES;
// how to get desired selected cell here to delete
MessagesCollectionViewCell *cell = [self.MessageCollectionView cellForItemAtIndexPath:self.GlobalIndexPath];
if([cell.Checkbox isHidden])
{
    [cell setHidden:YES];
}
else{
    [cell.Checkbox setChecked:NO];
    [cell.Checkbox setHidden:YES];
}
}

它不起作用。

为了显示选中的UICollectionViewCell已选中,我使用@Chris Chris Vasselli's solution

请帮我解决这个问题。提前致谢。

1 个答案:

答案 0 :(得分:0)

有几个步骤。首先,确定所选的indexPath,但不要假设在运行方法时有选择....

// in your button method
NSArray *selection = [self.MessageCollectionView indexPathsForSelectedItems];
if (selection.count) {
    NSIndexPath *indexPath = selection[0];
    [self removeItemAtIndexPath:indexPath];
}

从集合视图中删除项目还有两个步骤:从数据源中删除它们,并告诉它已更改的视图。

- (void)removeItemAtIndexPath:(NSIndexPath *)indexPath {
    // if your arrays are mutable...
    [self.Message_Heading removeObjectAtIndex:indexPath.row];

    // OR, if the arrays are immutable
    NSMutableArray *tempMsgHeading = [self.Message_Heading mutableCopy];
    [tempMsgHeading removeObjectAtIndex:indexPath.row];
    self.Message_Heading = tempMsgHeading;
    // ...

为每个数据源数组执行上面的一个或另一个。最后一步是通知集合视图数据源已更改,并且必须自行更新。有几种方法可以做到这一点。最简单的是:

    // ...
    [self.MessageCollectionView reloadData];

或者,更优雅一点:

    [self.MessageCollectionView deleteItemsAtIndexPaths:@[indexPath]];
}  // end of removeItemAtIndexPath