NSNotification到TableViewController无法正常工作

时间:2013-02-06 18:14:22

标签: objective-c ios6 uitabbarcontroller uitableview nsnotificationcenter

我有一个带有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;
}

2 个答案:

答案 0 :(得分:1)

添加项目后,您没有重新加载表格。

表格仅在创建和设置数组后重新加载,您还需要在添加项目时进行更新。

答案 1 :(得分:1)

我看到了几个问题。首先,在向数据数组添加对象时,不会调用自定义setter。它只会在您创建NSArray本身时调用,而不是在数组中添加或删除条目。因此,您应该废弃自定义setter并在addCurrentItemToCartFromNotification通知中调用reloadData。

另外,你应该在viewDidLoad中添加observor并在viewDidUnload中删除它,而不是awakeFromNib(在某些情况下不会被调用)。