如何将NSMutableString绑定到NSTextView的值?

时间:2010-09-05 04:30:53

标签: cocoa binding

好的,我正试图在Xcode中为自己设置一个非常简单的程序 我有一个窗口(在“接口”构建器中),其中包含NSTextView和NSButton。在我的AppController类中,我已将NSMutableString声明为属性。我想要做的是设置字符串的初始值,比如@“First Entry \ n”,然后将其绑定到NSTextView。当我按下按钮时,会调用-(IBAction)appendToString方法,将@"Another Line\n"追加到NSMutableString
我希望这些更改通过绑定和键值观察反映在NSTextView中,而不是通过声明IBOutlet并手动更新内容。我还想在textview中进行更改以编辑NSMutable字符串。

不幸的是,我非常困惑,并且没有任何运气可以解决这个问题。

如何解决这个问题的基本步骤是什么?

***** EDIT *****

好的,Peter Hosey间接地解决了这个问题。我忘了我必须使用setLogString方法,而不是使用[logString appendFormat:]。所以这是我最终得到的代码:

AppController.h中的

#import <Cocoa/Cocoa.h>
@interface AppController : NSObject {
    IBOutlet NSButton *appendButton;
    NSString *logString;
    IBOutlet NSTextView *thatView;
}
@property (readwrite, copy) NSString *logString;
-(IBAction)hitIt:(id)sender;
@end

AppController.m:

#import "AppController.h"
@implementation AppController
-(void)awakeFromNib
{
}
-(id)init
{
    [super init];   
    logString = @"First Line\n";
    return self;
}
-(IBAction)hitIt:(id)sender
{
    [self setLogString:[logString stringByAppendingString:@"Hey, Another Line!\n"]];
}
@synthesize logString;
@end

然后,在InterfaceBuilder中,我将NSTextView绑定到AppController.logString,并将HAD设置为“Continuously Updates Value”标志,以便对文本字段进行更改。

非常感谢帮助人员!

2 个答案:

答案 0 :(得分:3)

  

在我的AppController类中,我已将NSMutableString声明为属性。

这是正确的,符合MVC标准的解决方案。模型的主要所有者应该是控制器,而不是视图。所有视图都应从控制器获取模型。

但是,您不应该暴露字符串的可变性。然后,任何使用该属性的东西都可以尝试直接改变字符串,而AppController不知道该更改并且能够通知任何观察者该属性。该属性应声明为NSString,并作为readwrite,以提供一个访问器,用新的字符串替换该值。

  

我想要做的是设置字符串的初始值,比如@“First Entry \ n”,然后将它绑定到NSTextView。

init中设置支持该属性的实例变量的值。

在IB中绑定NSTextView。然后,在加载笔尖时它已经被绑定了。

请注意,您要在加载笔尖之前设置ivar 。如果先加载笔尖,文本视图将看不到更改,因为直接设置ivar(正如您在init中所做的那样,以避免产生属性副作用)正在观察者的背后进行更改(视图的) 背部。如果在加载nib时已经进行了更改(并且视图开始观察),则视图没有任何错过。

  

当我按下按钮时,方法, - (IBAction)appendToString ...

Cocoa中的每个动作只需要一个参数 - 不多也不少。该参数是发送消息的控件。因此,正确的签名是:

- (IBAction) appendToString:(id)sender;
  调用

...将@“Another Line \ n”追加到NSMutableString。

您需要做的就是向属性询问当前字符串,制作可变副本,进行更改,并将修改后的字符串设置为属性的新值。不要忘记发布那个可变副本。

  

我希望这些更改通过绑定和键值观察反映在NSTextView中,而不是通过声明IBOutlet并手动更新内容。我还想在textview中进行更改以编辑NSMutable字符串。

将文本视图的value绑定绑定到AppController的属性时,这两种情况都是免费的。

答案 1 :(得分:1)

而不是拥有变量的本地副本只需要这些简单的方法来设置和获取它。这样您就可以从视图中获得所有附加和编辑。

- (IBAction)appendString:(id)sender{
[[[textView textStorage] mutableString] appendString: string];

}

- (NSMutableString)getString{
return [[textView storage] mutableString];

}