ios 当没有更多的单元格要删除时,如何关闭UITableView中的编辑模式?

t5zmwmid  于 2023-01-27  发布在  iOS
关注(0)|答案(5)|浏览(131)

我试过把这个放在代码的各个部分,比如commitEditingStyle方法的末尾,但是我无法让它停止编辑模式,基本上,我想在没有更多单元格的时候自动退出编辑模式......

if ([self.tableView numberOfRowsInSection:0] ==0)
    {
        NSLog(@"this triggers, but doesn't stop editing..");
        self.tableView.editing = NO;
        [self.tableView endEditing:YES];
    }
fruv7luv

fruv7luv1#

[self setEditing:NO animated:YES]怎么样?我假设self是UITableViewController的一个示例。

ldfqzlk8

ldfqzlk82#

来自苹果文档:
Note: The data source should not call setEditing:animated: from within its implementation of tableView:commitEditingStyle:forRowAtIndexPath:. If for some reason it must, it should invoke it after a delay by using the performSelector:withObject:afterDelay: method.
因此,在commitEditingStyle中调用它并不是一个很好的做法。

yqyhoc1h

yqyhoc1h3#

如果不只是[self setEditing:NO animated:YES]

1qczuiv0

1qczuiv04#

在玩过这个游戏之后,下面是需要知道的事情:有单独的setEditing例程用于控制器和tableView。确保使用控制器的setEditing例程。而且,如上所述,它需要一个延迟。为此,我使用了Matt的延迟函数。作为一个额外的好处,当列表中没有项目时,可以禁用Edit按钮。当添加项目时,该按钮再次启用。代码在Swift5中。

var someArray: [SomeStruct] = [] {
    didSet {
        if let btn = navigationItem.rightBarButtonItem {
            if someArray.count > 0 {
                btn.isEnabled = true
            } else {
                btn.isEnabled = false   // Needs to respond immediately - don't put in delay
                closeDownEditMode()
            }
        }
    }
}

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}

func closeDownEditMode() {
    delay(0.1) { [weak self] in
        self?.setEditing(false, animated: true)
    }
}
tzdcorbm

tzdcorbm5#

正如tooluser提到的,docu声明setEditing:animated:不应该从tableView:commitEditingStyle:forRowAtIndexPath:内部调用,2023年仍然是这样。
然而,一个使它工作的解决方案是受this post的启发使用performBatchUpdates:completion:
iOS 15中的工作示例:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
   if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source:
        [_myData removeObjectAtIndex:indexPath.row];

        // Update table view:
        [tableView performBatchUpdates:^{
            // Delete the row:
            [tableView deleteRowsAtIndexPaths:@[indexPaths]
                             withRowAnimation:UITableViewRowAnimationFade];
        } completion:^(BOOL finished) {
            // Disable Edit mode if there is no more data (after deleting the last row):
            if ([self->_myData count] == 0) {
                [tableView setEditing:NO
                             animated:NO];
            }
        }];
   }
}

相关问题