将NSTextField绑定到NSString

时间:2012-11-29 16:59:03

标签: objective-c binding xcode4.3 cocoa-bindings nstextfield

我有一个非常简单的问题,希望有人能够在我开始理解绑定时回答。我想以编程方式更改我的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

2 个答案:

答案 0 :(得分:3)

不应该是

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实例会有效地将其复制为NSString,而传递NSString实例只会保留它。

祝你工作顺利。

答案 1 :(得分: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"];

但是,你需要“通知”观察者如上图所示的绑定。