好的,我正试图在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”标志,以便对文本字段进行更改。
非常感谢帮助人员!
答案 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];
}