将 NSTextField 绑定到 NSString

Posted

技术标签:

【中文标题】将 NSTextField 绑定到 NSString【英文标题】:Binding NSTextField to NSString 【发布时间】:2012-11-29 16:59:03 【问题描述】:

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

【问题讨论】:

您应该在某个时候将问题标记为已回答。 如何将其标记为已回答??? 您应该会看到arrow next to each answer。您只能将一个答案标记为解决方案。 【参考方案1】:

不应该

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 实例只是保留它。

祝你工作顺利。

【讨论】:

【参考方案2】:

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

@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"];

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

【讨论】:

以上是关于将 NSTextField 绑定到 NSString的主要内容,如果未能解决你的问题,请参考以下文章

NSTextField 不使用核心数据绑定更新计算属性

Cocoa NSTextField - 绑定和设置属性

NSManagedObjectContext 保存导致 NSTextField 失去焦点

将标签绑定到类的属性

Cocoa:如何将布尔属性绑定到 NSCellStateValue?

更新 tableview 绑定到数组错误