将NSTextField绑定到NSString

我有一个非常简单的问题,我希望有人能够在我开始理解绑定时回答。 我想以编程方式更改我的NSString值,并通过绑定将NSTextField更新为该值。 我有一个NSTextField和NSLabel。 为了表示正确改变myString的值,我有一个NSButton。

  • 我将NSTextField的Value绑定到App Delegate的myString属性并选中了连续更新值。
  • 我将NSLabel的Value绑定到了App Delegate的myString属性。
  • 我有NSButton插座hooked setDefault方法。
  • 当我输入NSTextField时,NSLabel会按预期更新,但是当我单击按钮时,myString属性会更新,但不会在NSTextField中更新。

    我需要做什么才能获得myString属性的NSTextField更新?

    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
    

    它不应该

    myString = @"This is a string";
    

    但是这个:

    self.myString = @"This is a string";
    

    都在-applicationDidFinishLaunching:和in -setDefault: 。 不要忘记在你的NSLog语句中指定self。 您可能想在-setDefault:指定一个不同的字符串-setDefault:以便您可以真正看到正在发生更改。

    另一件事:你有效地说你想分配给myString,但这不适合于一个对象。 代替:

    @property NSString *myString;
    

    你应该改用

    @property (copy) NSString *myString;
    

    或者至少

    @property (retain) NSString *myString;
    

    前者是首选,因为传递一个NSMutableString实例将其有效地复制为NSString ,而传递一个NSString实例只会保留它。

    祝你好运。


    我建议你加前缀你的成员变量。 这样您就可以直接区分设置成员或使用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"];
    

    但是接下来你需要向观察者“通知”上面所说的绑定。

    链接地址: http://www.djcxy.com/p/85243.html

    上一篇: Binding NSTextField to NSString

    下一篇: Qt application shows emoji instead of unicode character