将 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的主要内容,如果未能解决你的问题,请参考以下文章
NSManagedObjectContext 保存导致 NSTextField 失去焦点