我目前正试图在我的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,而不是第一次。
你能告诉我这里缺少什么吗?我非常感谢您对此问题的投入。谢谢, 麦克
答案 0 :(得分:0)
不确定为什么你会看到重新分配的数组(如果那是什么),但这需要一个不同的模式:我懒得初始你的购物车属性通过替换合成的setter ...
- (NSArray *)cart {
if (!_cart) {
_cart = [NSMutableArray array];
}
return _cart;
}
删除awakeFromNib中的购物车内容,并始终引用self.cart(init和dealloc除外)。
答案 1 :(得分:0)
每次添加条目时都会记录“self.cart == nil”,这意味着每次添加条目时都会调用awakeFromNib,这反过来意味着您正在创建一个新实例每次都是Observer类。这就是问题,而不是你帖子中的任何代码。要解决这个问题,我们需要知道如何创建这个类。