0

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

2 回答 2

1

我看到几个问题。首先,当您将对象添加到数据数组时,不会调用您的自定义设置器。它只会在您创建 NSArray 本身时调用,而不是从数组中添加或删除条目。所以你应该废弃你的自定义设置器并在你的 addCurrentItemToCartFromNotification 通知中调用 reloadData 。

此外,您应该在 viewDidLoad 中添加观察者并在 viewDidUnload 中删除它,而不是 awakeFromNib(在某些情况下不调用)。

于 2013-02-06T18:24:17.120 回答
1

添加项目后,您不会重新加载表格。

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

于 2013-02-06T18:21:25.043 回答