0

我的应用程序包含NSTabView两个选项卡。此外,应用程序本身具有playState一个枚举。playState保存在Singleton

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。这与我的枚举不匹配,它是一个int. 我也许可以使用 anNSValueTransformer来解决这个问题。
此外,selectedItemIdentifier不存在。NSTabView仅提供selectedTabViewItem然后允许访问identifierlabel. 虽然,我找不到基于标识符切换项目本身的方法。

4

2 回答 2

1

在这种情况下,我发现自己在做以下两件事之一:

1) 将 self (或其他对象)注册为相关属性的观察者,并在-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 类型的属性,你可以绑定你的选项卡视图的选择。

于 2011-09-19T15:32:52.130 回答
0

我忘了在 Interface Builder 中连接NSTabView它。 以下对我有用。IBOutlet

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

NSValueTransformer我返回一个NSString必须在 Interface Builder 中为每个选项卡设置的内容!

于 2011-09-19T15:30:38.810 回答