3

バインディングを理解し始めたら、誰かが答えてくれるといいのですが、非常に簡単な質問があります。プログラムでNSString値を変更し、バインディングを介してNSTextFieldをその値に更新したいと思います。NSTextFieldとNSLabelがあります。myStringの値を適切に変更することを表すために、NSButtonがあります。

  • NSTextFieldの値をAppDelegateのmyStringプロパティにバインドし、[継続的に値を更新]をオンにしました。
  • NSLabelの値をAppDelegateのmyStringプロパティにバインドしています。
  • NSButtonアウトレットをsetDefaultメソッドに接続しています。

NSTextFieldと入力すると、NSLabelは期待どおりに更新されますが、ボタンをクリックすると、myStringプロパティは更新されますが、NSTextFieldでは更新されません。

NSTextFieldをmyStringプロパティに更新するにはどうすればよいですか????

AppDelegate.h

@interface AppDelegate : NSObject<NSApplicationDelegate>
{
   NSString *myString;
}

@property (assign) IBOutlet NSWindow *window;
@property NSString *myString;

- (IBAction)setDefault:(id)sender;
@end

AppDelegate.m

@implementation AppDelegate

@synthesize window = _window;
@synthesize myString;

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
   myString = @"This is a string";
}

- (IBAction)setDefault:(id)sender
{
   NSLog(@"%@", myString);
   myString = @"This is a string";
   NSLog(@"%@", myString);
}
@end
4

2 に答える 2

4

あるべきではない

myString = @"This is a string";

でも、これ:

self.myString = @"This is a string";

-applicationDidFinishLaunching:との両方-setDefault:。NSLogステートメントでもselfを指定することを忘れないでください。-setDefault:変更が行われていることを実際に確認できるように、で別の文字列を指定することをお勧めします。

もう1つ:myStringに割り当てたいと効果的に言っていますが、それはオブジェクトには適切ではありません。それ以外の:

@property NSString *myString;

代わりに使用する必要があります

@property (copy) NSString *myString;

または少なくとも

@property (retain) NSString *myString;

NSMutableStringインスタンスを渡すと、インスタンスが効果的にコピーされ、インスタンスNSStringを渡すNSStringだけで保持されるため、前者が推奨されます。

あなたの努力であなたに幸運を。

于 2012-11-29T18:45:24.837 に答える
0

メンバー変数のプレフィックスを付けることをお勧めします。このようにして、メンバーを直接設定するか、セッターを使用するかを区別できます。あなたの例では、私は次のことをします。

@interface AppDelegate : NSObject<NSApplicationDelegate>
{
   NSString *m_myString;
}

@property (assign) IBOutlet NSWindow *window;
@property NSString *myString;

- (IBAction)setDefault:(id)sender;
@end

..。

@implementation AppDelegate

@synthesize window = _window;
@synthesize myString = m_myString;

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
   self.myString = @"This is a string";
}

- (IBAction)setDefault:(id)sender
{
   NSLog(@"%@", m_myString);
   self.myString = @"This is a string";
   NSLog(@"%@", m_myString);
}
@end

@synthesizeメンバー変数を割り当てるようにを変更したことに注意してください。

明確にするために:

self.myString = @"This is a string";

..は..の代替構文です。

[self setMyString:@"This is a string"];

メンバーを直接設定することもできます...

[self willChangeValueForKey:@"myString"];
m_myString = @"This is a string";
[self didChangeValueForKey:@"myString"];

ただし、上記のように、バインディングについてオブザーバーに「通知」する必要があります。

于 2012-11-29T19:20:28.433 に答える