关闭其中包含 UITableView 的模态 UIViewController 时出现的问题

Problems when dismissing a modal UIViewController with a UITableView in it

所以我有一个 UIViewController 以模态方式呈现在当前视图上。这个视图控制器仅包含一个 UITableView(用于 selecting 项目)和顶部的导航栏,如果您不想 select 任何东西,它有一个取消按钮。

整个过程几乎在任何情况下都能正常工作。选择一个项目有效,按下取消按钮关闭视图,一切都很好。但是,有一种情况会导致应用程序崩溃:当您在 table 视图中的某个项目上向左滑动以显示删除按钮,然后按顶部的取消按钮关闭视图时,应用程序崩溃并且它没有说明控制台输出中崩溃的原因。这是我模态呈现的视图控制器的代码:

.h:

#import <UIKit/UIKit.h>
#import "common.h"

@interface LoadViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

- (IBAction)lCancelButton:(id)sender;
@property (weak, nonatomic) IBOutlet UITableView *lTableView;

@end

.m:

#import "LoadViewController.h"

@interface LoadViewController () {
    NSMutableArray* sampleCounts;
    NSArray* tableData;
}
@end

@implementation LoadViewController

@synthesize lTableView = _lTableView;  // This is the table view itself

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        // Deleting an item when the delete button is pressed

        [self.lTableView beginUpdates];

        // Deleting it from the table view first
        [self.lTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

        // ... then from the arrays as well
        [sampleCounts removeObjectAtIndex:indexPath.item];
        // (making a mutable copy here so I can delete stuff from it)
        NSMutableArray* tmp = [tableData mutableCopy];
        [tmp removeObjectAtIndex:indexPath.item];
        tableData = tmp;

        [self.lTableView endUpdates];
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.lTableView.allowsMultipleSelectionDuringEditing = NO;
    sampleCounts = [NSMutableArray array];
    tableData = [NSMutableArray array];

    // I'm filling up both arrays with the appropriate data here...

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (IBAction)lCancelButton:(id)sender {
    // Dismiss the view controller when Cancel is pressed
    [self dismissViewControllerAnimated:YES completion:nil];
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.tableData.count;
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // If an item gets selected, store the name of it (I use a class called 'common' for storing data like this), then dismiss the view
    [common setItemName:[tableData objectAtIndex:indexPath.item]];
    [self dismissViewControllerAnimated:YES completion:nil];
}

-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString* ID = @"ID";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:ID];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }

    cell.textLabel.text = [self.tableData objectAtIndex:[indexPath row]];
    cell.detailTextLabel.text = [sampleCounts objectAtIndex:[indexPath row]];

    return cell;
}

@end

如您所见,非常简单。我在两个单独的数组中有项目名称和它们的描述(两个数组都包含 NSString*s),我用该信息填充 table 视图,仅此而已。剩下的就很简单了。

所以有没有人知道为什么当我在项目上滑动以显示删除按钮,然后通过按取消关闭视图控制器时应用程序崩溃?在所有其他情况下,一切都很好。只有当我在删除按钮可见时按下取消时它才会崩溃。

尝试以下操作:

- (void)viewWillDisappear:(BOOL)animated
{
    self.lTableView.editing = NO;
}

我能想到的就是你的模式。 可能是您处于编辑模式。 所以,请尝试在解雇前回到正常模式。

[self.tableView setEditing:No];