关闭其中包含 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];
所以我有一个 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];