【问题标题】:Binding NSTextField to NSString将 NSTextField 绑定到 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。您只能将一个答案标记为解决方案。

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


【解决方案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"];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多