Обратный вызов для удаления NSTokenFieldCell - PullRequest
0 голосов
/ 05 декабря 2010

У меня есть NSTokenField с NSTokenFieldCell, которые представляют управляемые объекты. Когда я создаю новый NSTokenFieldCell, печатая, мой делегат NSTokenField (NSArrayController) вызывается с этим методом:

tokenField:representedObjectForEditingString

В этом методе я создаю управляемый объект для новой ячейки токена, и он работает как положено.

Однако я не могу найти метод обратного вызова для удаления NSTokenFieldCell, где я могу удалить свой управляемый объект. Кто-нибудь знает, существует ли это? Если нет, я думаю, что мне придется каким-то образом отслеживать NSTokenField на предмет удалений, которые звучат не идеально.

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Трудно понять, что именно вы просите. Вы действительно имеете в виду, что вы создаете и удаляете NSTokenFieldCells? Я не думаю, что вы делаете - элемент управления NSTokenField имеет экземпляр NSTokenFieldCell. Вся сборка просто представляет определенные строки (которыми вы управляете через протокол NSTokenFieldDelegate) в виде графических «токенов». Ячейка не воссоздается каждый раз, только то, что она представляет / рисует.

Вы хотите сказать, что хотите получать уведомление, когда токенизированная строка удаляется из поля? Если это так, я боюсь, что это не так, как он предназначен для работы. Вы решаете, какие строки (разделенные набором символов токенизации, который вы указали для использования поля токена) токенизируются, а какая строка замены (обычно сокращенная или очищенная версия) отображается в качестве самого токена. Следовательно, вы должны определить, отсутствует ли «токен» в вашей модели, и очистить его самостоятельно.

Проще говоря: в «Привязках какао» нет возможностей сделать это. Лучше всего поддерживать флаг «-tokensNeedCleaning» и обрабатывать его так же, как методы -setNeedsDisplay: и -displayIfNeeded работают с NSView. Таким образом, когда поле токена будет отредактировано, вы можете вызвать [self setTokensNeedCleaning: YES]. Этот метод, в свою очередь, может вызывать «[self cleanTokensIfNeeded]» через -performSelector: withObject: afterDelay: (с нулевой задержкой), чтобы запланировать очистку отсутствующих токенов, если флаг needsCleaning равен YES. Затем он сбросит флаг.

Этот простой механизм предотвращает запуск процедуры очистки при каждом последующем редактировании, но, напротив, помечает ее и планирует запуск в ближайшем будущем, если она все еще требуется. Таким образом, последовательные запланированные вызовы -cleanTokensIfNeeded не будут слепо пытаться очистить - вызовы очистки будут объединены.

0 голосов
/ 02 марта 2012

Я только что ответил на этот вопрос в другой теме, кажется, что он мертв, поэтому я отвечу здесь:

Вы должны иметь возможность смоделировать делегат удаления, создав класс-оболочку токена, который имеет указатель на владельца, а также обернутый объект:

@protocol TokenWrapperDelegate 
-(void)tokenWasDeleted:(id)token;
@end

@interface TokenWrapper : NSObject {
  id<TokenWrapperDelegate> owner;
  id token;
}
-(id)initWithWrappedToken:(id)token owner:(id<TokenWrapperDelegate>)owner;
@property (nonatomic, weak) id<TokenWrapperDelegate> owner;
@property (nonatomic, strong) id token;
@end

Затем сделайте, чтобы TokenWrapper dealloc уведомил владельца о том, что токен был удален:

@implementation TokenWrapper

...

-(void)dealloc {
  [owner tokenWasDeleted:self.token];
  self.token = nil;
  [super dealloc];
}

@end

Затем в вашем обратном вызове representedObjectForEditingString верните автоматически выпущенную оболочку, указывающую на вашего владельца и ваш настоящий токен. Вы также должны будете убедиться, что изменили другие обратные вызовы делегата NSTokenField, чтобы углубиться в объект-оболочку. Убедитесь, что владелец устанавливает бит для игнорирования этих обратных вызовов, когда вы вручную изменяете содержимое NSTokenField (например, вызывая setObjectValue).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...