Как программно добавить привязку для NSTabView? - PullRequest
0 голосов
/ 19 сентября 2011

Мое приложение содержит NSTabView с двумя вкладками.Кроме того, само приложение имеет playState, который является перечислением.playState хранится в синглтоне .

typedef enum {
    kMyAppPlayStatePlaying,
    kMyAppPlayStatePaused
} MyAppPlayState;

Здесь синтезируется playState.

@property (readwrite) MyAppPlayState playState;

Я хочу переключить NSTabViewкаждый раз playState меняется.Поэтому я подготовил IBOutlet для добавления привязки, аналогичной этой.

[self.playPauseTabView bind:@"selectedItemIdentifier" toObject:[MyAppState sharedState] withKeyPath:@"playState" options:nil];

Я уже понял, что identifier должно быть NSString.Это не совпадает с моим enum, который является int.Возможно, я мог бы использовать NSValueTransformer, чтобы исправить это.
Кроме того, selectedItemIdentifier не существует.NSTabView предлагает только selectedTabViewItem, что позволяет получить доступ к identifier или label.Однако я не могу найти способ переключить сам элемент на основе идентификатора.

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

В подобных ситуациях я обнаруживаю, что делаю одну из двух вещей:

1) Зарегистрируйте себя (или какой-либо другой объект) в качестве наблюдателя рассматриваемого свойства и соответственно установите выбранную вкладку в -observeValueForKeyPath:ofObject:change:context:. Это может выглядеть так:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{ 
    if ( context == PlayStateChange )
    {
        if ( [[change objectForKey: NSKeyValueChangeKindKey] integerValue] == NSKeyValueChangeSetting )
        {
            NSNumber *oldValue = [change objectForKey: NSKeyValueChangeOldKey];
            NSNumber *newValue = [change objectForKey: NSKeyValueChangeNewKey];

            NSInteger oldInteger = [oldValue integerValue];
            NSInteger newInteger = [newValue integerValue];

            NSLog(@"Old play state: %ld, new play state: %ld", (long)oldInteger, (long)newInteger);

            // Do something useful with the integers here
        }

        return;
    }
}

2) объявите свойство NSString *, доступное только для чтения, и объявите, что на его значение влияет ваше свойство playState. Примерно так:

@property (readonly) NSString *playStateStr;

// Accessor
-(NSString *)playStateStr
{
    return playState == kMyAppPlayStatePlaying ? @"playing" : "paused";
}

+(NSSet *)keyPathsForValuesAffectingPlayStateStr
{
    return [NSSet setWithObject: @"playState"];
}

Теперь у вас есть свойство типа NSString, которое вы можете связать с выбранным представлением вкладки.

0 голосов
/ 19 сентября 2011

Я забыл соединить NSTabView с IBOutlet в Интерфейсном Разработчике.
У меня работает следующее.

NSDictionary* playStateOptions = [NSDictionary dictionaryWithObject:[[PlayStateValueTransformer alloc] init] forKey:NSValueTransformerBindingOption];
[self.playPauseTabView bind:@"selectedLabel" toObject:[MyAppState sharedState] withKeyPath:@"playState" options:playStateOptions];

В NSValueTransformer я возвращаю NSStringкоторый должен быть установлен в Интерфейсном Разработчике для каждой вкладки!

...