TableView编辑模式及自定义右滑多选图标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TableView编辑模式及自定义右滑多选图标相关的知识,希望对你有一定的参考价值。

参考技术A // 告诉tableView在编辑模式下可以多选

self.tableView.allowsMultipleSelectionDuringEditing = YES;

//进入编辑模式

[self.tableView setEditing:!self.tableView.isEditing animated:YES];

//刷新TableView的方式

- (void)insertRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;//插入一行

-(void)deleteRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;//删除一行

- (void)reloadRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_ios(3_0);//更新某一行

- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);//移动某一行

//右滑进入编辑模式,单个删除,置顶

-(NSArray*)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath)

[self.wineArray removeObjectAtIndex:indexPath.row];

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

];

UITableViewRowAction *topAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"置顶" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath)

XMGWine *wine = self.wineArray[indexPath.row];

[self.wineArray removeObject:wine];

[self.wineArray insertObject:wine atIndex:0];

[self.tableView reloadData];

];

return @[deleteAction,topAction];



//编辑模式多选自定义图片,不用系统的蓝色,在cell中布局时改变

- (void)layoutSubviews

for (UIControl *control in self.subviews)

if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")])

for (UIView *view in control.subviews)

UIImageView *image = (UIImageView *)view;

if (self.selected)

image.image = [UIImage imageNamed:@"CellButtonSelected"];

else

image.image=[UIImage imageNamed:@"CellButton"];









[super layoutSubviews];



- (void)setEditing:(BOOL)editing animated:(BOOL)animated



[super setEditing:editing animated:animated];

for (UIControl *control in self.subviews)

if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")])

for (UIView *view in control.subviews)



if ([view isKindOfClass: [UIImageView class]])

UIImageView *image=(UIImageView *)view;

if (!self.selected)

image.image=[UIImage imageNamed:@"CellButton"];











Core Data TableView - 编辑模式下的多选

【中文标题】Core Data TableView - 编辑模式下的多选【英文标题】:Core Data TableView - Multiple Selection During Edit Mode 【发布时间】:2015-01-22 06:04:51 【问题描述】:

我有两个使用 Core Data 的 TableView。我有一个 ItemTableview,其中包含用户列出的多行 Item,它允许在编辑模式下进行多项选择。在编辑模式下,它允许用户删除选定的项目,或一次删除所有项目。我希望将已删除的项目添加到 TrashTableView。

这是我目前所拥有的:

    - (IBAction)deleteAction:(id)sender


    NSManagedObjectContext *context = [self managedObjectContext];

    NSArray *selectedRows = [self.tableView indexPathsForSelectedRows];
    BOOL noItemsAreSelected = selectedRows.count == 0;
    BOOL deleteSpecificRows = selectedRows.count > 0;

    if (noItemsAreSelected) 

        // Delete all objects from the Core Data.
        NSFetchRequest *allItems = [[NSFetchRequest alloc] init];
        [allItems setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]];
        [allItems setIncludesPropertyValues:NO];

        NSError *error = nil;
        NSArray *items = [context executeFetchRequest:allItems error:&error];

        for (NSManagedObject *object in items) 
            [context deleteObject:object];
        
        // Add to Trash
        for (NSManagedObject *trashObject in items) 

        Item *selectedItems = trashObject; <-- #warning -Incompatible pointer types initializing "Items" with an expression of type "NSManagedObject"-
        Trash *newTrash = [NSEntityDescription insertNewObjectForEntityForName:@"Trash" inManagedObjectContext:context];

        newTrash.trashname = selectedItems.itemname;
        newTrash.created = [NSDate date];

        // Save the context
        NSError *saveError = nil;
        if (![context save:&saveError]) 
            NSLog(@"Save Failed! %@ %@", saveError, [saveError localizedDescription]);
        
        

        // Delete from the Array
        [_item removeAllObjects];

        // Tell the tableView that we deleted the objects.
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

        [self.tableView setEditing:NO animated:YES];
    

    else if (deleteSpecificRows) 

            NSMutableIndexSet *indicesOfItemsToDelete = [NSMutableIndexSet new];
            for (NSIndexPath *selectionIndex in selectedRows)
            
                [indicesOfItemsToDelete addIndex:selectionIndex.row];
            
            // Delete from the Array
            [_item removeObjectsAtIndexes:indicesOfItemsToDelete];

            // Tell the tableView that we deleted the objects
            [self.tableView deleteRowsAtIndexPaths:selectedRows withRowAnimation:UITableViewRowAnimationAutomatic];

        [self.tableView setEditing:NO animated:YES];
    

if (noItemsAreSelected) 被调用时,所有的项目都被删除并且它们都被添加到TrashTableView,但只有ItemTableView 的第一行给出了字符串。所以在 TrashTableView 中,第一行有一个文本,但其余行只是没有任何文本的空白单元格。 在调试器中,空白单元格有 NSString trashname = nil; 但 NSDate created = "2015-01-22 03:41:30 +0000"; 有一个日期。

对于else if (deleteSpecificRows),我不知道如何在 Core Data 中做到这一点......

我花了很多时间试图解决这个问题,所以任何帮助都将不胜感激。谢谢!

【问题讨论】:

请检查selectedItems.itemname是否为空,请。 当我删除三个项目1、2和3时,selectedItems.itemname:1 :(null) :(null) 【参考方案1】:

您以错误的顺序做事:您当前从上下文中删除所有项目,然后遍历项目,创建相应的垃圾项目并每次保存上下文。这适用于第一项。但是在第一个项目之后,上下文已经被保存,所以删除操作(对于所有项目)将会发生,这会消除它们的所有属性。因此你的空值。

我会重组如下:

if (noItemsAreSelected) 

    NSFetchRequest *allItems = [[NSFetchRequest alloc] init];
    [allItems setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]];
    [allItems setIncludesPropertyValues:NO];

    NSError *error = nil;
    NSArray *items = [context executeFetchRequest:allItems error:&error];

    for (Item *trashObject in items) 
    // Add to Trash
        Trash *newTrash = [NSEntityDescription insertNewObjectForEntityForName:@"Trash" inManagedObjectContext:context];

        newTrash.trashname = trashObject.itemname;
        newTrash.created = [NSDate date];
        // Delete
        [context deleteObject:trashObject];
    
    // Save the context
    NSError *saveError = nil;
    if (![context save:&saveError]) 
        NSLog(@"Save Failed! %@ %@", saveError, [saveError localizedDescription]);
    

请注意,更改 for(Item *trashObject ...) 中的转换应该避免编译器警告。

编辑

对于deleteSpecificRows 的情况,您可以使用类似的代码,但使用您的_item(我假设这是一个可变数组,它是您的tableView 的数据源):

else if (deleteSpecificRows) 
    NSMutableIndexSet *indicesOfItemsToDelete = [NSMutableIndexSet new];
    for (NSIndexPath *selectionIndex in selectedRows)
    
        // First, get the trash object...
        Item *trashObject = [_item objectAtIndex:selectionIndex.row];
        // Add to Trash
        Trash *newTrash = [NSEntityDescription insertNewObjectForEntityForName:@"Trash" inManagedObjectContext:context];
        newTrash.trashname = trashObject.itemname;
        newTrash.created = [NSDate date];
        // and delete the object from the context
        [context deleteObject:trashObject];
        // and update the list of items to delete
        [indicesOfItemsToDelete addIndex:selectionIndex.row];
    
    // Delete from the Array
    [_item removeObjectsAtIndexes:indicesOfItemsToDelete];
    // Tell the tableView that we deleted the objects
    [self.tableView deleteRowsAtIndexPaths:selectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView setEditing:NO animated:YES];

请注意,这是未经测试的,因此可能需要整理....

从长远来看,您可能需要考虑 a) 使用 NSFetchedResultsController 作为 tableView 的数据源,b) 而不是为垃圾箱创建单独的实体,向现有实体添加标志 (inTrash?) 和只是将其更改为true。然后,您的 tableView 将必须仅显示 inTrash = false 的项目。

【讨论】:

哇,我没有意识到这一点。现在效果很好!谢谢你。知道怎么做else if (deleteSpecificRows)?? 感谢您的帮助和建议。我会让你知道它是否有效。我将研究 NSFetchedResultsController。祝你有美好的一天! (deleteSpecificRows) 正在使用您在上面提供的代码。再次感谢 pbasdf。

以上是关于TableView编辑模式及自定义右滑多选图标的主要内容,如果未能解决你的问题,请参考以下文章

Core Data TableView - 编辑模式下的多选

ios如何自定义tableView编辑模式

深挖UITableViewCell-编辑多选模式下,引发的深思

tableView 编辑模式删除按钮(减号)没有响应点击 - 我该如何解决这个问题?

iOS开发UI篇-tableView在编辑状态下的批量操作(多选)

Tableview编辑模式下禁用TextField