2012-04-27 11 views
0

我在學習如何使用一個主數據類爲不同的類設置變量。 enter image description here在Cocoa中設置不同類中的變量

ClassA的

#import <Foundation/Foundation.h> 

@interface ClassA : NSObject { 
    NSString *stringA; 
    NSString *stringB; 
} 

@property (nonatomic, copy) NSString *stringA; 
@property (nonatomic, copy) NSString *stringB; 

@property (weak) IBOutlet NSTextField *textA; 
@property (weak) IBOutlet NSTextField *textB; 

- (IBAction)displayStrings:(id)sender; 

@end 

#import "ClassA.h" 

@implementation ClassA 

@synthesize stringA, stringB, textA, textB; 

- (IBAction)displayStrings:(id)sender { 
    [textA setStringValue:stringA]; 
    [textB setStringValue:stringB]; 
} 

@end 

類X

#import <Foundation/Foundation.h> 

@interface ClassX : NSObject { 
    NSMutableString *stringX; 
} 

- (void)theVariables:(id)sender; 

@end 

#import "ClassX.h" 
#import "ClassA.h" 

@implementation ClassX 

- (void)awakeFromNib { 
    [self theVariables:self]; 
} 

- (void)theVariables:(id)sender { 
    stringX = [[NSMutableString alloc] init]; 

    ClassA *clssA = [[ClassA alloc] init]; 

    [stringX setString:@"stringX for stringA"]; 
    [clssA setStringA:stringX]; 

    [stringX setString:@"stringX for stringB"]; 
    [clssA setStringB:stringX]; 
} 

@end 

沒有錯誤出現在:的我想要做什麼圖,從我的項目中的代碼

這裏的代碼,但是當我運行該程序時,我收到一條關於「無效參數不令人滿意:aString」的錯誤。它看起來像IBOutlet的setStringValue不起作用。有什麼建議麼?

+0

請在您的問題中包含錯誤,並解釋實際結果與預期結果的差異。 – 2012-04-27 19:40:08

+0

@JacquesCousteau更新了我的問題。 – wigging 2012-04-27 19:47:28

+0

該錯誤指向'displayStrings:'內的行嗎? – 2012-04-27 19:50:52

回答

1

我沒有看到你所提到的錯誤,但據我可以從你的代碼告訴,主要的問題是這一行:

ClassA *clssA = [[ClassA alloc] init]; 

您必須在廈門國際銀行有ClassA一個實例,它連接到文本字段和一個按鈕。 xib中的這個對象是一個真實的對象,如果你只是在你的代碼的某個地方創建另一個ClassA實例,那麼你有一個完全不同的對象,它與xib中的對象沒有任何關係。

您需要確保/更改兩件事。首先,你的xib中需要有一個ClassX的實例。其次,ClassX需要一個出口到ClassA實例:

@class ClassA; // Declare ClassA so you can use it below 

@interface ClassX : NSObject 

@property (weak) IBOutlet ClassA * theClassAInstance; 

- (void)theVariables:(id)sender; 

@end 

哪個應該再在廈門國際銀行文件連接。然後,在theVariables:,你剛纔用的,而不是創建的ClassA一個新的實例插座:風格[[self theClassAInstance] setStringA:@"stringX for stringA"];


三點:

首先,你應該導入Cocoa.h:#import <Cocoa/Cocoa.h>,而不是基金會.h在任何觸及GUI的類中(在這種情況下爲ClassA)。這就是像NSTextField這樣的東西被定義的地方。它無論如何工作,因爲Cocoa.h通過您的.pch文件導入,但最好是明確的。

其次,創建一個可變字符串並將其值更改爲兩個不同的字符串並沒有太大的意義。只需直接使用文字:[clssA setStringA:@"stringX for stringA"];

第三,您不需要單獨聲明實例變量; @synthesize爲您創建它們,現在是推薦的做法,以聲明它們:

@interface ClassA : NSObject 

@property (nonatomic, copy) NSString *stringA; 
@property (nonatomic, copy) NSString *stringB; 

@property (weak) IBOutlet NSTextField *textA; 
@property (weak) IBOutlet NSTextField *textB; 

- (IBAction)displayStrings:(id)sender; 

@end 

末(!四點),你真的應該在ClassA通過屬性訪問的stringAstringB值:[textA setStringValue:[self stringA]];

+0

哈利路亞 - 它的作品!試圖弄清楚這一點我一直在瘋狂。 – wigging 2012-04-27 21:39:49

+0

還有一件事,我應該怎麼在應用程序啓動後在'ClassA'中實現'displayStrings:'?我嘗試使用'awakeFromNib',但我再次得到同樣的錯誤。 – wigging 2012-04-27 21:41:13

+0

想通了,我也可以調用ClassA中的方法!我可以通過'[[self theClassA] displayStrings:sender]在ClassX中使用以下內容;'Sweet,這照顧我以前的評論。 – wigging 2012-04-28 00:08:16