NSMutableArray属性在TableViewController中自动重置

时间:2013-02-07 00:49:09

标签: ios objective-c nsmutablearray uitableview nsnotificationcenter

我目前正试图在我的TableViewController上获取NSMutableArray属性,该属性是从NSNotification更新但面临问题。

我在Observer类.h文件中声明了我的属性,如下所示:

@property (nonatomic,strong) NSMutableArray *cart;

Observer类.m文件中的Synthesize:

@synthesize cart = _cart;

我收到Observer类的AwakeFromNib方法中的通知:

- (void)awakeFromNib{

if (!self.cart){
    NSLog(@"self.cart == nil");
    self.cart = [[NSMutableArray alloc] init];
}else{
    NSLog(@"self.cart != nil");
}

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addCurrentItemToCartFromNotification:) name:@"ItemAddedToCart" object:nil];
}

请注意,我在接收通知之前,正在上面的AwakeFromNib方法中执行我的NSMutableArray属性的alloc init。

这是收到通知后调用的方法:

- (void)addCurrentItemToCartFromNotification:(NSNotification *)notification{

 NSDictionary *currentItem = [notification.userInfo objectForKey:@"CART_ITEM_INFORMATION"];

[self.cart addObject:currentItem];
[self.tableView reloadData];

}

然后我根据我的NSMutableArray属性获取了我的tableview数据源方法,该属性在上述方法中从通知中更新。

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

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

// Configure the cell...
NSDictionary *cartItem = [self.cart objectAtIndex:indexPath.row];
cell.textLabel.text = [cartItem objectForKey:@"ITEM_NAME"];

return cell;
}

我对程序的预期行为是在收到通知的时候更新我的NSMutable数组属性(由于if(!self.cart)条件,alloc init应该只在第一次发生)

但是每次收到通知时都会发生这种情况,NSMutableArray中的对象会被删除,而新的对象会被添加而不是附加。因此,在任何时间点,NSMutableArray仅包含从最近通知收到的对象。

我认为每次都会发生alloc init,而不是第一次。

你能告诉我这里缺少什么吗?我非常感谢您对此问题的投入。

谢谢, 麦克

2 个答案:

答案 0 :(得分:0)

不确定为什么你会看到重新分配的数组(如果那是什么),但这需要一个不同的模式:我懒得初始你的购物车属性通过替换合成的setter ...

- (NSArray *)cart {
    if (!_cart) {
        _cart = [NSMutableArray array];
    }
    return _cart;
}

删除awakeFromNib中的购物车内容,并始终引用self.cart(init和dealloc除外)。

答案 1 :(得分:0)

每次添加条目时都会记录“self.cart == nil”,这意味着每次添加条目时都会调用awakeFromNib,这反过来意味着您正在创建一个新实例每次都是Observer类。这就是问题,而不是你帖子中的任何代码。要解决这个问题,我们需要知道如何创建这个类。