2013-07-12 2 views
3

В моем UITableViewCell у меня есть метод initNotification, который вызывается TableViewController в cellForRowAtIndexPath, где создаются TableCells.Где добавитьObserver в NSNotificationcenter в пользовательский UITableViewCell?

Моя проблема заключается в том, что каждый раз, когда это представление перезагружается, метод initNotification вызывается снова, поэтому, когда появляется уведомление, NotificationHandle называется x-times!

Я попытался удалить наблюдателя, прежде чем добавить его снова:

-(void) initNotification{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(handleNotificationOnOff:) 
    name:[[NSString alloc] initWithFormat:@"%@",[self.light beckhoffOnOff]] 
    object:nil]; 
} 

, но это не работает. Проблема в том, что я не могу использовать флаг bool или что-то в этом роде, потому что Cells всегда повторно инициализируются ViewController.

Есть ли способ удалить NotificationHandle из NotificationCenter?

редактировать: Это, как я создаю мои пользовательские TableViewCells

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    Light* l = [[staticModel.model getRoomAtIndex:[indexPath section]]getLightAtIndex:[indexPath item]]; 
    if([l typ]==ONOFF){ 
     TableCellLight *conof = [tableView dequeueReusableCellWithIdentifier:@"ReuseIDOnOff" forIndexPath:indexPath]; 
     LightOnOff *lonof = (LightOnOff*) l; 
     [[conof label] setText: [lonof bezeichnung]]; 
     conof.light=lonof; 

     [conof initNotification]; 
     cell = conof; 
    } 
    if([l typ]==DIMMER){ 
     TableCellLightDim *cdim = [tableView dequeueReusableCellWithIdentifier:@"ReuseIDDim" forIndexPath:indexPath]; 

     LightDim *ldim= (LightDim*) l; 
     [[cdim label] setText: [ldim bezeichnung]]; 
     [[cdim slider]setValue:[ldim dimVal]]; 
     cdim.light=ldim; 
     [cdim initNotification]; 
     cell = cdim; 
    } 
    if([l typ]==RGB){ 
     TableCellLightRGB *crgb = [tableView dequeueReusableCellWithIdentifier:@"ReuseIDRGB" forIndexPath:indexPath]; 
     LightRGB *lrgb= (LightRGB*) l; 
     [[crgb label] setText: [lrgb bezeichnung]]; 
     crgb.light=lrgb; 
     crgb.owner=self; 
     [crgb initNotification]; 
     cell = crgb; 
    } 

    return cell; 
} 

Благодаря

ответ

11

Вообще говоря, клетка не должна наблюдать что-нибудь. Контроллер должен наблюдать изменения и нажимать обновленную информацию на ячейки.

Вызов removeObserver: перед добавлением наблюдателя должен работать. Если вы собираетесь сделать что-нибудь в prepareForReuse или tableView:didEndDisplayingCell:forRowAtIndexPath:, чтобы сбросить ячейку, это будет код, который вы используете. Вам нужно посмотреть, как вы тестировали, что он не работает, и как вы повторно используете ячейки.

+0

Спасибо за ответ! Я выяснил, почему removeObserver: не работает, потому что само не то же самое больше, каждый раз, когда TableView перезагружается (и ячейки также), я получаю новый экземпляр каждой ячейки. Есть ли способ заставить ячейки освободиться? – user2071938

+0

Если вы не будете повторно использовать ячейки, они должны быть освобождены (например, у вас нет идентификатора повторного использования). Но это не идеально. – Wain

+0

У меня есть идентификатор повторного использования, но почему это заканчивается для многих экземпляров одной и той же ячейки? – user2071938