2016-06-01 4 views
0

В моем приложении я получаю объект по NSNotificationCenter (образуют другой контроллер) и добавить объект UITableView:Неправильный объект добавлен в UITableView

-(void)viewWillAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(RosterSave:) name:@"RosterSave" object:nil]; 
} 

-(void)RosterSave:(NSNotification *)notification 
{ 
    NewRoster* newRoster = [[NewRoster alloc]init]; 
    newRoster = notification.object; 
    [myUser.rosterArray addObject:newRoster]; 
    [self.myRoster reloadData]; 
} 

Это метод Tableview:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return myUser.rosterArray.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    NSString *iden = @"MyTable"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:iden]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:iden]; 
    } 
    NewRoster* myNewRoster = [myUser.rosterArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = myNewRoster.nameRoster; 
    return cell; 
} 

Когда пользователь добавляет первый объект, tableView получает собственную строку. Когда пользователь добавляет второй объект, он добавляет две строки второго объекта и таким образом.

Как исправить эту проблему?

+1

Не могли бы вы проверить, сколько раз вызывается 'RosterSave:'? И проверять 'myUser.rosterArray' каждый раз в нем? – Larme

+0

с какими проблемами вы сталкиваетесь? – Feroz

+0

Можете ли вы отредактировать ответ и четко указать, что представляет собой ваша проблема? – EridB

ответ

1

У вас есть observer(notification) в viewWillAppear, которые вызывается каждый раз при появлении вида.

добавить уведомление в viewDidLoad вместо viewwillAppear.

1

Мне всегда нравится добавлять подписки NSNotification в init/и unsubscriptions в dealloc. Этот шаблон легко читается и отлаживается. Кроме того, он гарантирует, что вы никогда не сможете удвоить подписку или отказаться от подписки.

В вашем случае, вы склонны к созданию нескольких subscribtions в viewWillAppear

- (instancetype)init 
{ 
    ... 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(RosterSave:) name:@"RosterSave" object:nil]; 
    ... 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
0

@Feroz прав о вас выделении нового объекта и заменить его notification.object. @Lion прав насчет viewDidLoad и viewDidAppear. Вы генерируете несколько уведомлений. Вам нужно генерировать только один объект. Поместите контрольную точку в свой код RosterSave и подсчитайте, сколько раз она вызывается для нового объекта. Также посмотрите на трассировку стека, чтобы узнать, кто генерирует эти вызовы. Речь идет о простом переходе, понимании вашего кода и понимании того, что происходит.

+0

Я бы предпочел init вместо viewDidLoad. – Feroz

+0

@Sanjit правильно также с удалениемObserver, а также добавлением. Исходное уведомление, вероятно, все еще существует, когда вызывается viewDidAppear, а затем добавляется еще один. –

Смежные вопросы