我有一个带有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的属性(我从Notification接收和更新),它不返回数据。
请你告诉我在这里缺少的地方和地点。
谢谢, 麦克
编辑:响应@Joel,@ martin,@ mkirci
将重新加载数据添加到我的“addCurrentItemToCartFromNotification”(收到通知时调用的方法)有所帮助。我现在能够看到我的Tab B(TableViewController)上的通知收到的项目。
现在发生了什么:
每当收到通知时,NSMutableArray属性将返回为nil。因此,每次收到通知时,都会为NSMutableArray属性(在addCurrentItemToCartFromNotification上)发生alloc init - (而不仅仅是第一次)。因此,不是使用从通知接收的对象递增数组,而是每次都重新创建数组,并且仅添加形成当前通知的对象。
请你详细说明这种情况。感谢您的所有回复。
谢谢, 麦克
EDIT2
更新了针对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;
}
答案 0 :(得分:1)
添加项目后,您没有重新加载表格。
表格仅在创建和设置数组后重新加载,您还需要在添加项目时进行更新。
答案 1 :(得分:1)
我看到了几个问题。首先,在向数据数组添加对象时,不会调用自定义setter。它只会在您创建NSArray本身时调用,而不是在数组中添加或删除条目。因此,您应该废弃自定义setter并在addCurrentItemToCartFromNotification通知中调用reloadData。
另外,你应该在viewDidLoad中添加observor并在viewDidUnload中删除它,而不是awakeFromNib(在某些情况下不会被调用)。