在Objective-C中向表中添加一行

时间:2009-09-18 19:19:54

标签: objective-c nsmutablearray nsarray

我是Objective-C的新手,我在尝试向表中添加新行时遇到了很多麻烦。它的工作方式是,当应用程序加载弹出警报时,询问用户是否愿意,启动新配置,加载已保存的配置或恢复上次配置。现在,如果他们选择启动新配置,他们将被要求输入新名称,当他们点击完成后,应用程序会将新配置保存在表格中。

现在我只能让应用程序在表中存储一个配置,但如果用户尝试再创建一个新配置,那么应用程序崩溃了。 这是我的代码:

- (IBAction) testToAddToList
{
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name

    NSMutableArray *array = [[NSMutableArray alloc] init];

    [array insertObject:nameOfConfig atIndex:configListDataIndex];

    self.configListData = array;

    [array release];

    configListDataIndex ++;
}

我一直在阅读很多有关这些内容的内容,但这似乎不应该太难。另外我觉得主要的问题是“数组”只有一个索引,当用户试图添加另一个导致应用程序崩溃的原因时。

有人可以帮帮我,告诉我我做错了什么以及我该怎么做?请!......或者只是指出我正确的方向?

2 个答案:

答案 0 :(得分:2)

使用NSMutableArray的-addObject:方法而不是insertObject会不会更简单?为什么要使用额外的变量(configListDataIndex),当你可以简单地使用addObject:nameOfConfig:

[array addObject:nameOfConfig];
self.configListData = array;
[array release];

就是这样。

我想我知道为什么它会崩溃......你总是创建一个新的数组对象,并且每次在始终新的空数组中的不同位置插入“nameOfConfig”。因此,configListData将始终只有一个对象。编辑configListData不是更好吗?

答案 1 :(得分:2)

正如Woofy所提到的,问题是你每次都在创建一个新数组,而不是抓住以前创建的数组。因此,第一次添加到数组时,您基本上就是这样做:

[array insertObject:nameOfConfig AtIndex:0];

但是下次你创建一个全新的(空)数组,而configListDataIndex变量现在是1,所以你调用

[array insertObject:nameOfConfig atIndex:1];

并崩溃,因为1超出空数组的界限。要解决此问题,您可以执行以下操作:

NSMutableArray *array;
if (self.configListData != nil)  // I know, unnecessary, but I like being explicit with my nil checks.
    array = self.configListData;
else
    array = [NSMutableArray array];

然后不要在函数结束时释放它(因为我假设你的configListData的getter是自动释放的,或者是赋值)。

这将修复crasher。此外,您随时可以致电

[array addObject:nameOfConfig];

会自动将对象添加到数组的末尾,因此您可以删除索引变量。但是你应该首先修复crasher,因为更改第二部分只会隐藏错误,并使新配置替换旧配置更加神秘。