0

У меня есть UITableView в сочетании с выбранным контроллером результатов. Я развернул контроллер, изменит метод контента и установит делегат frc для себя.Выполнить селектор после метода делегата Получить вызов

Но в функции я хочу, чтобы ее делегат отказался, так что изменение имени делегата не изменится, и после некоторых операций измените делегат на себя, чтобы убедиться, что другие методы работают правильно:

-(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 к себе, метод делегата еще будет называться.

Как это решить? Большое спасибо.

+0

Можете ли вы вставить еще какой-нибудь код? –

+0

уже обновлен. Я изменяю frc в цикле for, но метод делегата вызывается только после возврата метода функции. Более того, если я положил цикл for в другую функцию и назову его здесь, метод делегирования будет по-прежнему вызываться после возврата этой функции. Поэтому я просто хочу знать, как установить делегат самостоятельно, но запретить вызовы методов делегата. Спасибо – Alvin

ответ

0

Прежде всего:

Делегирование способ настроить поведение объектов. Он имеет сходство с подклассом на основе каждого экземпляра. Вы изменили бы иерархию класса экземпляра, пока объект живет? (Да, вы бы делали в некоторых ситуациях - очень редко.)

Таким образом, делегат объекта не является «состоянием» объекта, вы должны изменить его. Это нечто вроде «вида» объекта. Вы должны пересмотреть свой подход.

Во-вторых:

Причина заключается в том, что все изменения, которые собирают и сообщение делегат отправляется после этого, при сбросе делегата. Такое поведение лучше в большинстве ситуаций. Из документов:

Вместо того чтобы реагировать на изменения в индивидуальном порядке (как показано в типичном использовании), вы могли бы просто реализовать controllerDidChangeContent: (который отправляется делегат, когда все ожидающие изменения были обработаны), чтобы перезагрузить вид таблицы.

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

К вашему Q:

Вы должны перепроверить, почему вы не хотите получать информацию об изменениях в конкретной ситуации, в то время как вы хотите быть в курсе и в других ситуациях. Это похоже на структурный запах. Если вы действительно в такой ситуации, вам следует перепроверить это снова. Если вы все еще в такой ситуации, вы можете установить флаг внутри делегата, который сигнализирует игнорировать изменение.

+0

Спасибо за ваш ответ. Но даже если я устанавливаю флаг для игнорирования изменений, производительность довольно плохая (потому что я изменяю все объекты в получаемом контроллере результатов, производительность неплохая, если я установил делегат на нуль). – Alvin

+0

Можете ли вы создать минимальный проект, который показывает это? –

Смежные вопросы