0

私のアプリケーションには、NSTabView2つのタブがあるが含まれています。さらに、アプリケーション自体には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。これは、である私の列挙型と一致しませんint。私は多分NSValueTransformerこれを修正するために使用することができます。
また、selectedItemIdentifier存在しません。またはにアクセスできるNSTabViewオファーのみ。しかし、識別子に基づいてアイテム自体を切り替える方法を見つけることができません。selectedTabViewItemidentifierlabel

4

2 に答える 2

1

そのような状況では、次の 2 つのいずれかを行っていることに気付きます。

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 型のプロパティができました。

于 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];

各タブの Interface Builder で設定する必要があるをNSValueTransformer返します。NSString

于 2011-09-19T15:30:38.810 に答える