我有一个带有 2 个选项卡的选项卡控制器 - A 和 B。选项卡 A 是常规 UIViewController,选项卡 B 是 TableViewController。我正在尝试从选项卡 A 发布 NSNotification 并接收相同内容并在选项卡 B 的表中显示数据。
我从选项卡 A 发布通知如下:
//"itemAddedToCartDictionary" is the object that I am sending with notification
[[NSNotificationCenter defaultCenter] postNotificationName:@"ItemAddedToCart" object:nil userInfo:itemAddedToCartDictionary];
在我的选项卡 B(TableViewController) 中,我试图接收上述通知更新 NSMutableArray 属性。该属性声明如下:
选项卡 B - .h 文件:
@property (nonatomic,strong) NSMutableArray *cart;
选项卡 B - .m 文件:
//providing manual setter method for 'items' hence not using @synthesize
- (void)setCart:(NSMutableArray *)cart{
_cart = cart;
[self.tableView reloadData];
}
现在,我在 AwakeFromNib 中放置了用于接收通知的代码(在选项卡 B 中),如下所示:
- (void)awakeFromNib{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addCurrentItemToCartFromNotification:) name:@"ItemAddedToCart" object:nil];
}
该代码在收到更新我的属性的通知后调用方法“addCurrentItemToCartFromNotification”:
- (void)addCurrentItemToCartFromNotification:(NSNotification *)notification{
NSDictionary *currentItem = [notification.userInfo objectForKey:@"CART_ITEM_INFORMATION"];
if (!self.cart){
NSLog(@"self.cart == nil");
self.cart = [[NSMutableArray alloc] init];
}else{
NSLog(@"self.cart != nil");
}
[self.cart addObject:currentItem];
}
现在这是我面临的问题:
在选项卡 A 中发布通知后,选项卡 B(TableViewController) 不显示任何数据,即使我已在收到通知的上述方法中更新了我的属性。我的 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];
NSDictionary *cartItem = [self.cart objectAtIndex:indexPath.row];
cell.textLabel.text = [cartItem objectForKey:@"ITEM_NAME"];
return cell;
}
所以基本上,我正在从数据源方法访问我的 TableViewController 的属性(我从通知接收和更新)并且它没有返回数据。
您能否让我知道我在这里缺少的地方和内容。
谢谢,迈克
编辑:根据@Joel、@martin、@mkirci 的回复
将重新加载数据添加到我的“addCurrentItemToCartFromNotification”(收到通知时调用的方法)有帮助。我现在能够在我的选项卡 B(TableViewController)上看到收到通知的项目。
现在这是正在发生的事情:
每当收到通知时,NSMutableArray 属性都会返回为 nil。因此,每次收到通知时,都会为 NSMutableArray 属性(在 addCurrentItemToCartFromNotification 上)发生分配初始化 - (而不仅仅是第一次)。因此,不是用从通知接收到的对象递增数组,而是每次都重新创建数组,并且只添加来自当前通知的对象。
请您对这种情况有所了解。感谢您的所有回复。
谢谢,迈克
编辑2
更新了为 initwithnibname 截取的代码,以获取@Joel 的建议
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
if (!self.cart){
NSLog(@"self.cart == nil");
self.cart = [[NSMutableArray alloc] init];
}else{
NSLog(@"self.cart != nil");
}
return self;
}