在调用Delegate方法后执行选择器

时间:2014-12-14 04:34:22

标签: ios objective-c uitableview delegates nsfetchedresultscontroller

我有一个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之后,仍会调用委托方法。

如何解决这个问题?非常感谢。

1 个答案:

答案 0 :(得分:0)

首先:

委派是一种自定义对象行为的方法。它与每个实例的子类化有相似之处。在对象生存时,您是否会更改实例类的层次结构? (是的,你会在某些情况下这样做 - 很少。)

所以对象的委托不是对象的“状态”,你应该改变。它就像一个物体的“种类”。你应该重新检查你的整个方法。

其次:

原因是当您重置委托时,将收集所有更改并在之后发送委托消息。在大多数情况下,此行为更好。来自文档:

  

而不是单独响应变化(如图所示)   典型使用),你可以实现controllerDidChangeContent:   (当所有挂起的更改都已发送给代理人时)   已重新加载表视图。

https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/index.html

致你的问:

您应该重新检查,在您希望在其他情况下获得通知时,为什么您不希望被告知特定情况的变化。这看起来像结构气味。如果你真的处于这种情况,你应该再次重新检查。如果您仍处于这种情况,可以在委托中设置一个标志,表示忽略更改。