调用委托方法后执行选择器
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 - 未调用委托方法