NSTokenField и удаление токенов - PullRequest
       16

NSTokenField и удаление токенов

3 голосов
/ 23 декабря 2011

Мое приложение позволяет пользователям прикреплять теги к определенным объектам модели (подклассы NSManagedObject).Класс Tag также является подклассом NSManagedObject.Я решил использовать NSTokenField для отображения тегов, где каждый токен содержит экземпляр Tag в качестве представленного объекта.Все это работает довольно хорошо, но я застрял в ситуациях, когда пользователь удаляет токен, так как я хочу проверить, не стал ли связанный тег устаревшим и должен ли он быть удален.

Я ожидал, что метод в NSTokenFieldDelegateили NSTokenFieldCellDelegate, который позволил бы мне перехватить и проверить действие по удалению токена.

После некоторого поиска в Google я нашел этот пост , посвященный теме.Я реализовал предложенный метод controlTextDidChange: в моем контроллере (делегат поля токена).После проверки элемента управления, который передается в качестве аргумента, обнаруживается, что он является экземпляром NSTokenTextView, для которого я не могу найти никакой документации (возможно, частного класса).

Кто-нибудь сталкивался с этим и нашел решениеизящно удалять токены, сохраняя при этом базовую модель представленных объектов?

EDIT

Я также нашел this , что, по-видимому, предполагает, что по какой-то причине это непредназначен для работы, как и все остальные ожидают.

Ответы [ 2 ]

3 голосов
/ 29 февраля 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).

3 голосов
/ 24 декабря 2011

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

Если у кого-то нет сильных сторон, чтобы противостоять моему текущему мнению, NSTokenField - немного уродливый монстр, приносящий наполовину испеченную реализацию на вечеринку. Какой позор, потому что презентационная сторона мне действительно нравится ...

РЕДАКТИРОВАТЬ: После некоторых дальнейших экспериментов я остановился на приемлемом компромиссе. Я использую NSTokenField в режиме только для чтения. Он берет соответствующие теги из моего основного хранилища данных и отображает их как токены. Я добавил меню для каждого токена, который позволяет пользователю редактировать, удалять или просматривать теги. Стандартная кнопка рядом с полем токена позволяет добавить новый тег. Редактирование и рецензирование реализовано с использованием NSPopovers. Смотрите этот пример:

enter image description here

Есть еще некоторые незначительные проблемы:

  • Жетоны имеют тенденцию исчезать в произвольные моменты времени при наведении мыши на поле жетонов. Это похоже на ошибку.
  • Поскольку поле токена принимает только NSArray для его привязки, я ввел «виртуальное свойство» с именем tagsAsArray, которое берет связанные теги и преобразует их из NSSet в NSArray. Я думаю, что это влияет на KVO, так как редактирование тегов отображается только после нажатия клавиши ввода или щелчка за пределами поля токена.
...