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时,原始通知可能仍然存在,然后添加另一个通知。