我有一个UITableView与一个获取的结果控制器相结合。我部署控制器将更改内容方法,并将frc的委托设置为self。
但是在一个函数中,我想要将它的代理区分开,以便更改内容委托方法不会被调用,并在一些操作后再次将委托更改为self以确保其他方法正常工作,就像这样:
-(void)function
{
self.frc.delegate = nil;
for (id obj in self.frc.fetchedObjects) {
if ([obj isKindOfClass:[MultiValue class]]) {
MultiValue * multiValue = (MultiValue *)obj;
multiValue.isSelected = [NSNumber numberWithBool:YES];
}
}
self.frc.delegate = self;
}
问题是,委托方法(controllerWillChangeContent)将在函数方法之后调用,所以在我将self.frc.delegate设置为self之后,仍会调用委托方法。
如何解决这个问题?非常感谢。
答案 0 :(得分:0)
首先:
委派是一种自定义对象行为的方法。它与每个实例的子类化有相似之处。在对象生存时,您是否会更改实例类的层次结构? (是的,你会在某些情况下这样做 - 很少。)
所以对象的委托不是对象的“状态”,你应该改变。它就像一个物体的“种类”。你应该重新检查你的整个方法。
其次:
原因是当您重置委托时,将收集所有更改并在之后发送委托消息。在大多数情况下,此行为更好。来自文档:
而不是单独响应变化(如图所示) 典型使用),你可以实现controllerDidChangeContent: (当所有挂起的更改都已发送给代理人时) 已重新加载表视图。
致你的问:
您应该重新检查,在您希望在其他情况下获得通知时,为什么您不希望被告知特定情况的变化。这看起来像结构气味。如果你真的处于这种情况,你应该再次重新检查。如果您仍处于这种情况,可以在委托中设置一个标志,表示忽略更改。