2011-03-08 76 views
3

我有一个NSMutableArray一个UITableViewController在这样的标题:的NSMutableArray removeObjectAtIndex:indexPath.row崩溃

NSMutableArray *someArray; 

我也有属性声明:

@property (nonatomic, retain) NSMutableArray *someArray; 

在.m文件我在该方法中加载阵列:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    someArray = [[NSMutableArray alloc] init]; 

    [self loadArrayData]; 

    [tableview reloadData]; 
} 

该表填充很好,添加没有问题,但w母鸡我尝试删除一行,以下线的应用程序崩溃:

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

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

    [someArray removeObjectAtIndex:indexPath.row]; 

    //update table etc.. 

如果我使用调试器,我可以看到阵列具有一定的对象,当我登录indexPath.row我得到的值在数组大小内。

我不明白它为什么会崩溃在这条线上......谁能帮助我?

控制台输出:

*终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因: ' - [__ NSArrayI removeObjectAtIndex:]:无法识别的选择发送到实例0x6193890'

+1

有关崩溃的更多信息可能会有所帮助。发生了什么样的碰撞? – 2011-03-08 20:09:44

+0

对不起,我添加了控制台错误输出.. – CyberK 2011-03-08 20:12:49

+0

嗯,我真的不知道。很明显,一个无效的参数被传递给removeObjectAtIndex :.但是indexPath.row应该返回一个NSUInteger,它是一个有效的参数。 – 2011-03-08 20:44:24

回答

1

我有同样的发行一周。我做的是这样的:

在同一个tableViewController.m实现文件中声明一个NSMutableArray * globalArray作为一个全局变量。然后里面

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    globalArray = [[NSMutableArray alloc] initWithArray:someArray]; 
    [globalArray removeObjectAtIndex:[indexPath row]]; 
} 

然后我在reloadData调用之前将这个globalArray复制回someArray。作品。

+0

嗨。感谢您的回复!它修复了我正面临的问题,但现在它在UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]上崩溃了。在tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath任何想法如何解决这个问题? – CyberK 2011-03-08 21:13:08

+3

你不应该用这样的黑客“修复”你的错误。 – 2011-03-08 21:46:53

+0

很棒的回答,@Bourne。谢谢! – Adela 2015-07-16 07:23:15

0
  1. 不知道这引起你的问题之一,但如果你有属性someArray然后用self.someArray而不只是someArray。 当然,使用的自我,你应该自动释放它像这样经过:

self.someArray = [[[NSMutableArray的 页头] INIT]自动释放]。

(称为您的viewController init方法内)

然后尝试:

[self.someArray removeObjectAtIndex:indexPath.row]; 

2. 尝试调用[self loadArrayData];viewDidLoad。 应该之前的cellForRowAtIndexPath被调用,这样你就不会需要调用reloadData

如果仍然没有帮助,然后张贴的loadArrayData

+0

嗨,我会尝试,当我回家。我为什么调用reloadData的问题是因为我有一个导航控制器,它有一个“添加”按钮,它将视图推到一个新的视图,用户可以输入一些细节,当他点击“保存”时,导航控制器会弹出,那么它必须重新加载数据,因为用户刚刚输入了一条新记录......如何在不使用reloadData的情况下完成该操作? – CyberK 2011-03-09 12:22:45

+0

您可以将要更新的数组传递给新的viewController并在那里更新它。当你回到tableViewController时,tableView是不是自己重新加载?不要以为你需要调用reloadData。 – Idan 2011-03-09 12:45:34

2

我有一个非常类似的问题的代码和我在开始我的阵列CoreData这样的:

self.allContacts = (NSMutableArray*)[cdc.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

尝试投放从CoreDataController读取请求的NSMutableArray结果。

原来我在获取请求结束时需要名为“mutableCopy”的函数。

self.allContacts = (NSMutableArray*)[[cdc.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 

我不认为转换为(MutableArray *)是必需的,但我有它以防万一。

希望这会有所帮助。

+0

请注意,这固定了您所遇到的错误。 – c0d3Junk13 2012-10-19 19:29:39