-2

我正在尝试从 NSUserDefaults 创建一个 NSMutableArray,以便稍后添加/删除和编辑它

我的代码是

- (void)viewDidLoad {
[super viewDidLoad];

NSUserDefaults *ArrayTable = [NSUserDefaults standardUserDefaults];
[ArrayTable setObject:@"One" forKey:@"myArray"];
[ArrayTable setObject:@"Two" forKey:@"myArray"];
[ArrayTable setObject:@"Three" forKey:@"myArray"];
[ArrayTable setObject:@"Four" forKey:@"myArray"];
[ArrayTable setObject:@"Five" forKey:@"myArray"];
[ArrayTable synchronize];

NSMutableArray *array = [[NSMutableArray alloc] init];
array = [ArrayTable objectForKey:@"myArray"];
}


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

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    cell.textLabel.text = [array objectAtIndex:indexPath.row];
    return cell;
}

当我构建并运行时,什么都没有出现

我用谷歌搜索但没有任何帮助,我确定我不明白怎么做

我需要的是构建一个包含空数据的表格视图的应用程序,使用将填写数据添加/删除/编辑

有人可以帮我解释一下吗

先感谢您

4

4 回答 4

2

首先,您将用户默认值中的数组分配给名为 的局部变量array。假设你有一个这个类的属性也叫array,这个本地赋值会屏蔽它。如果没有,当你试图调用-count一个字符串时你会崩溃。

NSUserDefaults对象是字典。每次调用-setObject:forKey:它时,实际上都是在替换之前为该键设置的对象。因此,在您的一系列调用结束时-setObject:forKey:,结果值为NSString Five

您不能真正将可变对象存储在 中NSUserDefaults,而是在将其分配给局部变量或 ivar 时获取该对象的可变副本。要获得您可能期望的行为,您应该执行以下操作:

- (void)viewDidLoad
{
  // Create the array template and store it in NSUserDefaults
  NSArray* arrayTemplate = [NSArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", nil];
  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
  [defaults setObject:arrayTemplate forKey:@"myArray"];
  [defaults synchronize];

  // Retrieve a mutable copy of the array from user defaults and assign it to the
  // the property 'array' <- note, this should be an NSMutableArray
  self.array = [[defaults objectForKey:@"myArray"] mutableCopy]; // if not using arc, autorelease this here
}

使用该示例代码,它应该按照您预期的方式运行,您可以继续。显然,设置数组-viewDidLoad然后立即读取可变副本是没有意义的。要记住的关键是-setObject:forKey:它将始终替换已为该键设置的任何对象。它不添加元素或类似的东西。

于 2012-06-14T17:19:46.503 回答
1

您的问题是您将一堆字符串都设置为同一个键:

[ArrayTable setObject:@"yourvalue" forKey:@"myArray"];

只是不断覆盖您的最后一个值。为了将数组保存为默认值,您必须以另一种方式进行。这个问题可能会对您有所帮助:array to defaults

于 2012-06-14T17:15:35.567 回答
1

由于您实际上并不希望与 NSUserDefaults 的内容有任何关系,因此您只是在询问如何初始化可变数组。以下是您尝试做的事情的方法:

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"One"];
[array addObject:@"Two"];
[array addObject:@"Three"];
[array addObject:@"Four"];
[array addObject:@"Five"];

或者,更简单地说:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", nil];

(这些并不完全相同。如果您使用 MRC,第一个创建一个您拥有的数组并且必须手动释放,而第二个创建一个自动释放的数组。如果您不了解其中的区别,第二个在你学习之前更好,但很快你应该去学习。)

如果你想知道为什么你所做的没有奏效,这里是:

NSUserDefaults *ArrayTable = [NSUserDefaults standardUserDefaults];

在这里,您正在复制一个 NSUserDefaults 对象,它不是数组或表;它是用户和系统偏好的包装器,就像具有额外功能的字典一样。

[ArrayTable setObject:@"One" forKey:@"myArray"];

此行将名为“myArray”的首选项添加到您的应用程序的用户域首选项,其值为“One”。

[ArrayTable setObject:@"Two" forKey:@"myArray"];
[ArrayTable setObject:@"Three" forKey:@"myArray"];
[ArrayTable setObject:@"Four" forKey:@"myArray"];
[ArrayTable setObject:@"Five" forKey:@"myArray"];

这些行反复更改“myArray”首选项的值,以“Five”结尾。

[ArrayTable synchronize];

这可确保您的首选项已保存到磁盘。

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

这将创建一个新的可变数组并将其存储在变量“array”中。

array = [ArrayTable objectForKey:@"myArray"];

这会从您的偏好中获取“五”字符串并将其存储到变量“数组”中。

这意味着您现在失去了对实际数组的唯一引用。

这也意味着变量的静态类型不再匹配动态类型。当您稍后调用 [array count] 或 [array objectAtIndex:n] 时,您会将这些消息发送到字符串,而不是数组,因此您可能会遇到异常或其他意外行为。(嗯,几乎可以保证无论你得到什么都会出乎意料,因为你认为你正在与一个由 5 个对象组成的数组交谈,而不是一个字符串。)

于 2012-06-14T21:09:57.753 回答
0

创建数组并将其添加到用户默认值。

- (void)viewDidLoad {
//...
NSArray * tmpArray = [NSArray arrayWithObjects:@"One",@"Two",@"Three",@"Four", @"Five", nil];

NSUserDefaults *ArrayTable = [NSUserDefaults standardUserDefaults];
[ArrayTable setObject:tmpArray forKey:@"myArray"];
[ArrayTable synchronize];

array = [[ArrayTable objectForKey:@"myArray"] mutableCopy]; 
// array has to be an ivar of your viewcontroller to access it outside of viewDidLoad
// define in your header like @property (nonatomic, strong) NSMutableArray * array;
// with @synthesize array; in the implementation

}

于 2012-06-14T17:16:55.540 回答