2010-09-05 59 views
2

好的,所以我正試圖在Xcode中爲自己設置一個非常簡單的程序。
我有一個窗口(在界面生成器),它包含一個NSTextView和一個NSButton。在我的AppController類中,我已聲明NSMutableString作爲屬性。我想要做的是爲該字符串設置一個初始值,比如@「First Entry \ n」,然後將它綁定到NSTextView。當我按下按鈕時,會調用-(IBAction)appendToString的方法,該方法將@"Another Line\n"附加到NSMutableString
我想通過綁定和鍵值觀察,而不是聲明IBOutlet並手動更新內容,然後將這些更改反映到NSTextView中。我還想要在textview中編輯NSMutable字符串。如何將NSMutableString綁定到NSTextView的值?

不幸的是,我非常困惑,並沒有任何運氣搞清楚這一點。

如何進行此操作的基本步驟是什麼?

*****編輯*****

好吧,彼得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設置「連續更新值」標誌,以便對字符串進行對文本字段的更改。

非常感謝幫助傢伙!

+0

你不需要在那裏使用'alloc'和'initWithFormat:'。當你有一個格式字符串可以傳遞時,你只應該使用'initWithFormat:'(和'stringByAppendingFormat:')。這些字符串都不包含任何格式化序列,因此您應該在第一種情況下分配裸字符串文本(它是NSString,因爲它是文字,所以不保留),並使用'stringByAppending' * String:在第二種情況下。 – 2010-09-06 01:13:11

+0

哎呀,謝謝你抓到彼得。我正在使用的真正的程序確實使用了stringByAppendingFormat,並且我不小心把它帶到了我的測試程序中。現在修復。 :) – TraxusIV 2010-09-07 01:06:31

回答

2

裏面我的AppController類,我宣佈一個的NSMutableString作爲屬性。

這是正確的,符合MVC的解決方案。模型的主要所有者應該是控制器,而不是視圖。所有視圖都應該從控制器獲取模型。

但是,您不應該暴露字符串的可變性。任何使用該屬性的東西都可能試圖直接對字符串進行變異,而AppController不知道變化並能夠通知任何觀察者屬性。該屬性應該被聲明爲NSString,並且作爲readwrite來提供一個訪問器,用它來替換一個新字符串的值。

我想要做的是爲字符串設置一個初始值,比如@「First Entry \ n」,然後將它綁定到NSTextView。

設置支持init中屬性的實例變量的值。

在IB中綁定NSTextView。然後,當您加載筆尖時,它已經被綁定。

請注意,您希望在之前設置ivar 加載筆尖。如果首先加載筆尖,則文本視圖將不會看到更改,因爲直接設置伊娃(正如您在init中所做的,以避免產生財產副作用)正在使觀察者(視圖)背後的變化發生。如果您在加載筆尖時已經進行了更改(並且該視圖開始觀察),那麼視圖不會漏掉。

當我按下按鈕,一個方法, - (IBAction爲)appendToString ...

可可每一個動作到底需要一個參數,沒有更多的,不下。這個論點是發送消息的控件。因此,正確的簽名是:

- (IBAction) appendToString:(id)sender; 

...被稱爲該追加@ 「另一行\ n」 來了的NSMutableString。

您只需要爲屬性請求當前字符串,創建可變副本,進行更改並將修改的字符串設置爲屬性的新值。不要忘記釋放該可變副本。

我想通過綁定和鍵值觀察來反映在NSTextView中,而不是通過聲明IBOutlet並手動更新內容來反映這些更改。我也喜歡在textview中編輯NSMutable字符串的更改。

當你綁定文本視圖的value綁定到你的AppController的屬性時,這兩種情況都是免費的。

1

而不是有一個本地副本的變量只是有這些簡單的方法來設置和獲取它,當你需要。這樣你就可以從視圖中獲得所有的附加和編輯。

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

}

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

}

+0

這是一個很好的解決方案,我想我將在我的REAL計劃中使用它。然而,我仍然想把這個字符串綁定垃圾郵件取出來,因爲我認爲它可能在以後很重要,至少它讓我覺得它不能像我認爲的那樣工作。 困擾我的事情是,我可以得到漂浮物和整數綁定就好。它的對象,如NSString等,這是與我一起搞砸,我敢肯定,這與它們都是通過指針傳遞的事實有關。 – TraxusIV 2010-09-05 05:11:58

+0

是的,我敢打賭,他們在很多課程中都製作了他們自己的字符串副本,這樣你就永遠無法得到一個指向它的直接指針。 – 2010-09-05 14:14:06

+0

那麼你打算將視圖中的模型值存儲起來?不是很MVC;它應該擁有該模型的控制器,並且所有視圖都應該從控制器中獲取它。 – 2010-09-05 14:58:27

相關問題