我有一个非常简单的问题,希望有人能够在我开始理解绑定时回答。我想以编程方式更改我的NSString值,并通过绑定让NSTextField更新为该值。我有一个NSTextField和NSLabel。为了表示正确改变myString的值,我有一个NSButton。
当我输入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
答案 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"];
但是,你需要“通知”观察者如上图所示的绑定。