3

ステータス バー メニュー内にモデルのデータを表示したいと思います。そのため、エンティティ オブジェクトを次のタイトルにバインドしましたNSMenuItem

        [self.statusMenu setAutoenablesItems:NO];

        NSMenuItem * exportMenuItem = [[NSMenuItem alloc] init];
        [exportMenuItem bind:@"title" toObject:expo withKeyPath:@"menuItemTitle" options:nil];
        [exportMenuItem setEnabled:NO];

        [self.statusMenu insertItem:exportMenuItem atIndex:3];

初期化からこれまでのところ正常に動作します。しかし、モデルを更新しても、のタイトルは更新されませんNSMenuItem

4

2 に答える 2

1

参考までに、この問題に対する標準的な解決策は、次のようなクラス メソッドを実装することです。

+ (NSSet *)keyPathsForValuesAffectingMenuItemTitle
{
    return [NSSet setWithObjects: @"propertyMenuItemTitleDependsOn1", 
                                  @"propertyMenuItemTitleDependsOn2",
                                  nil];
}

このようなメソッドを実装すると、他のプロパティが変更されるたびに、フレームワークがキーの呼び出しwillChangeValueForKey:を処理します。didChangeValueForKey:menuItemTitle

于 2012-12-08T13:39:22.313 に答える
0

わかった:

menuItemTitleの 2 つの実際のプロパティを結合する動的ゲッター メソッドですexpoNSMenuItemのタイトルが更新されない理由は、menuItemTitleおそらく実際には設定されないからです。

menuItemTitleでは、プロパティの 1 つが設定されたときに、それが変更されたことをどのように確認すればよいでしょうか? のセッターをオーバーライドexpoして追加する[self willChangeValueForKey:@"menuItemTitle"];[self didChangeValueForKey:@"menuItemTitle"];、セッター自体を何度も呼び出す際に無限ループが発生するため、機能しません。

だからここに私の解決策があります:私は上書きしました[NSManagedObject setValue:(id)value forKey:(NSString *)key]

- (void)setValue:(id)value forKey:(NSString *)key {
    [self willChangeValueForKey:@"menuItemTitle"];
    [super setValue:value forKey:key];
    [self didChangeValueForKey:@"menuItemTitle"];
}
于 2012-12-07T09:49:17.950 に答える