3

我有一个非常简单的问题,希望在我开始理解绑定时有人能回答。我想以编程方式更改我的 NSString 值,并通过绑定将 NSTextField 更新为该值。我有一个 NSTextField 和 NSLabel。为了表示正确更改 myString 的值,我有一个 NSButton。

  • 我将 NSTextField 的值绑定到 App Delegate 的 myString 属性,并检查了持续更新值。
  • 我将 NSLabel 的值绑定到 App Delegate 的 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:以便实际看到正在发生更改。

另一件事:您实际上是在说要分配给 myString,但这不适合对象。代替:

@property NSString *myString;

你应该改用

@property (copy) NSString *myString;

或者至少

@property (retain) NSString *myString;

前者是首选,因为传递NSMutableString实例有效地将其复制为 a NSString,而传递NSString实例只是保留它。

祝你在你的努力中好运。

于 2012-11-29T18:45:24.837 回答
0

我建议您为成员变量添加前缀。这样,您可以区分直接设置成员或使用 setter。在您的示例中,我将执行以下操作。

@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 回答