I am communicating between two classes with NSNotificationCenter. My problem is that although I tap a button once (and that button only fires off once) I am unintentionally producing increasing numbers of notifications from only one call to the NSNotificationCenter.

Here is a better explanation of the problem, with code:

---

My two classes are the **mainView** class and the **Menu** class.

When a view in the **mainView** class is tapped, it launches a view created and governed by the **Menu** class. This code is called when the **mainView** is initialized:

```
menu=[[MyMenu alloc] init];
UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapped:)];
[tap setNumberOfTapsRequired:1];
[container addGestureRecognizer:tap];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onChangeItem:) name:@"ItemChange" object:nil];

```

This Gesture Recognizer fires off this method, also in the **mainView** class:

```
- (void) onTapped: (UIGestureRecognizer*) recognizer {
    NSLog(@"tap");
    [menu displayMenu];
}

```

This is how the **Menu** class initializes:

```
- (MyMenu*) init {
    self=[super init];
    UICollectionViewFlowLayout * layout=[[UICollectionViewFlowLayout alloc] init];
    menuView=[[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) collectionViewLayout:layout];
    [menuView setDataSource:self];
    [menuView setDelegate:self];
    [menuView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
    [menuView setAutoresizesSubviews:YES];
    [menuView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
    [menuView setBackgroundColor:[UIColor clearColor]];
    [menuView setIndicatorStyle:UIScrollViewIndicatorStyleWhite];
    return self;
}

```

And this is the `displayMenu` method inside the **Menu** class:

```
- (void) displayMenu {
    [viewForMenu addSubview:menuView];
}

```

The **Menu** class also has a `clearMenu` method:

```
- (void) clearMenu {
    [menuView removeFromSuperview];
}

```

This is the code for each cell in the UICollectionView, contained within my **Menu** class:

```
- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell * cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    [cell setTag:indexPath.row];
    UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onButtonTapped:)];
    [tap setNumberOfTapsRequired:1];
    [cell addGestureRecognizer:tap];
    NSLog(@"button tapped : %d",indexPath.row);
    return cell;
}

```

This calls the `onButtonTapped:` method, also within my **Menu** class:

```
- (void) onButtonTapped:(UIGestureRecognizer*) recognizer {
    NSInteger buttonTapped=[[recognizer view] tag];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ItemChange" object:nil userInfo:@{@"selected":@(buttonTapped)}];
[self clearMenu];
}

```

This notification is picked up by my **mainView** class with this code:

```
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onChangeItem:) name:@"ItemChange" object:nil];

```

This calls the `onChangeItem:` method, inside my **mainView** class:

```
- (void) onChangeItem: (NSNotification*) notification {
    NSLog(@"change item to %d",[[[notification userInfo] objectForKey:@"clock"] intValue]);
}

```

So that's the code.

---

OK, here's the problem: the first time the menu displays I get this in my log:

```
...[43023:11f03] tap
...[43023:11f03] button tapped : 1
...[43023:11f03] change item to 1

```

And this is fine, this is what I expect. However second time around I get this:

```
...[43023:11f03] tap
...[43023:11f03] button tapped : 1
...[43023:11f03] change item to 1
...[43023:11f03] change item to 1

```

Third time around I get this:

```
...[43023:11f03] tap
...[43023:11f03] button tapped : 1
...[43023:11f03] change item to 1
...[43023:11f03] change item to 1
...[43023:11f03] change item to 1
...[43023:11f03] change item to 1

```

And so on. Each successive tap on a menu item doubles the amount of notification calls.

---

To begin with I thought I was adding multiple views, and thus resulting in multiple button taps, and therefore multiple notifications calls. 

However as you can see from my logs, this is not the case. **The buttons are only receiving 1 tap event - this is firing off only 1 notification - but receiving class gets sent multiple notifications.**

Can anyone explain this to me?

Sorry for the lengthy post!