2016-06-01 11 views
0

に加え、UITableViewにオブジェクトを追加:間違ったオブジェクトは、私は<code>NSNotificationCenter</code>(別のコントローラを形成する)ことにより、オブジェクトを取得私のアプリでの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は自分の行を取得します。ユーザーが2番目のオブジェクトを追加すると、2番目のオブジェクトの2行がこのように追加されます。

この問題を解決するにはどうすればよいですか?

+1

'RosterSave:'が何回呼ばれたか確認できますか?そして、 'myUser.rosterArray'を毎回チェックしますか? – Larme

+0

あなたはどんな問題に直面していますか? – Feroz

+0

答えを編集して、問題点を明確に指摘できますか? – EridB

答えて

1

observer(notification)viewWillAppearに追加しました。これは、ビューが表示されるたびに呼び出されます。

viewwillAppearの代わりにviewDidLoadに通知を追加してください。

1

私はいつもdeallocのinit /とunsubscriptionsにNSNotificationサブスクリプションを置いています。このパターンは読みやすくデバッグが容易です。また、購読を二重にしたり、二重の予約を解除したりすることは決してありません。あなたのケースでは

は、あなたがviewWillAppear

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

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

で複数のsubscribtionsを作成する傾向がある@Ferozは、新しいオブジェクトを割り当て、notification.objectに置き換えることについての権利です。 @LionはviewDidLoadとviewDidAppearの間で正しいです。複数の通知を生成しています。オブジェクトごとに1つだけ生成する必要があります。 RosterSaveコードにブレークポイントを置き、新しいオブジェクトごとに何回呼び出されたかを数えます。スタックトレースを見て、誰がこれらの呼び出しを生成しているかを確認してください。踏み込んだり、コードを理解したり、何が起きているかを見るのは簡単なことです。

+0

私は、viewDidLoadではなくinitを好むでしょう。 – Feroz

+0

@SanjitはremoveObserverとaddを持つことでも正しいです。 viewDidAppearが呼び出され、別の通知が追加されると、元の通知がそこに残っている可能性があります。 –

関連する問題

 関連する問題