Ios 向UITableView添加了错误的对象

Ios 向UITableView添加了错误的对象,ios,objective-c,uitableview,Ios,Objective C,Uitableview,在我的应用程序中,我通过NSNotificationCenter(从另一个控制器)获取一个对象,并将该对象添加到UITableView: -(void)viewWillAppear:(BOOL)animated { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(RosterSave:) name:@"RosterSave" object:nil]; } -(void)RosterSa

在我的应用程序中,我通过
NSNotificationCenter
(从另一个控制器)获取一个对象,并将该对象添加到
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将获得自己的行。当用户添加第二个对象时,它会以这种方式添加第二个对象的两行


如何解决此问题?

您在
视图中将出现
中添加了
观察者(通知)
,每次视图出现时都会调用该功能


viewDidLoad
中添加通知,而不是
viewwillbeen

您在
viewwillbeen
中添加了
观察者(通知)
,每次视图出现时都会调用该通知


viewdiload
中添加通知,而不是
viewwillbeen

我总是喜欢将NSNotification订阅置于init/中,将取消订阅置于dealloc中。此模式易于阅读和调试。此外,它保证您永远不会双重订阅或双重取消订阅

在您的情况下,您很容易在
视图中创建多个订阅将出现

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

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

我总是喜欢将NSNotification订阅放在init/中,取消订阅放在dealloc中。此模式易于阅读和调试。此外,它保证您永远不会双重订阅或双重取消订阅

在您的情况下,您很容易在
视图中创建多个订阅将出现

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

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

@Feroz正确地分配了一个新对象,并将其替换为notification.object@Lion关于viewDidLoad与viewDidLoad的说法是正确的。如果您正在生成多个通知。每个对象只需生成一个。在RosterSave代码中设置断点,并计算每个新对象调用断点的次数。还可以查看堆栈跟踪以查看谁在生成这些调用。这可以归结为一个简单的问题,即单步执行、理解代码并查看发生了什么。

@Feroz正确地分配了一个新对象,并将其替换为notification.object@Lion关于viewDidLoad与viewDidLoad的说法是正确的。如果您正在生成多个通知。每个对象只需生成一个。在RosterSave代码中设置断点,并计算每个新对象调用断点的次数。还可以查看堆栈跟踪以查看谁在生成这些调用。这可以归结为一个简单的问题,即一步一步地进行,了解您的代码,并查看发生了什么。

您能检查一下调用了多少次
RosterSave:
?并在其中每次检查
myUser.rosterArray
?您面临的问题是什么?您能否编辑答案并明确指出您的问题是什么?首先,您正在RosterSave:method中分配NewFloster对象,下一行您将使用通知对象“NewFloster=notification.object;”对其进行设置,你为什么首先分配?你能检查一下调用了多少次
RosterSave:
?并在其中每次检查
myUser.rosterArray
?您面临的问题是什么?您能否编辑答案并明确指出您的问题是什么?首先,您正在RosterSave:method中分配NewFloster对象,下一行您将使用通知对象“NewFloster=notification.object;”对其进行设置,为什么要首先进行分配?。我更喜欢init而不是viewDidLoad。@Sanjit使用removeObserver和add也是正确的。调用viewDidAppear时,原始通知可能仍然存在,然后添加了另一个通知。我更喜欢init而不是viewDidLoad。@Sanjit使用removeObserver和add也是正确的。调用viewDidAppear时,原始通知可能仍然存在,然后添加另一个通知。