调用委托方法后执行选择器

Posted

技术标签:

【中文标题】调用委托方法后执行选择器【英文标题】:Perform Selector After Delegate Method Get Called 【发布时间】:2014-12-14 04:34:22 【问题描述】:

我有一个 UITableView 与一个获取的结果控制器相结合。我部署的控制器将更改内容方法,并将 frc 的委托设置为 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后,还是会调用委托方法。

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

【问题讨论】:

你能再贴一些代码吗? 已经更新。我在for循环中更改了frc,但是委托方法只会在函数方法返回后被调用。更何况,如果我把for循环放到另外一个函数里,在这里调用,这个函数返回后,还是会调用delegate方法。所以我只想知道如何将委托设置为 self 但禁止调用委托方法。谢谢 【参考方案1】:

首先:

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

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

其次:

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

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

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

致你的问题:

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

【讨论】:

感谢您的回答。但是即使我设置了一个标志来忽略更改,性能也很差(因为我更改了获取结果控制器中的所有对象。如果我将委托设置为 nil,性能非常好)。

以上是关于调用委托方法后执行选择器的主要内容,如果未能解决你的问题,请参考以下文章

通过委托为另一个类中的手势识别器调用选择器

UIDocumentPickerViewController - 未调用委托方法

无法调用选择器和手势委托 iOS 13.2

如何在表格视图中调用选取器视图内容?

委托delegate与Dictionary实现action选择器

如何从人员选择器委托方法返回两个视图控制器