2012-12-21 188 views
3

我嘗試從另一個類訪問公共方法。我已經嘗試了很多我在網上找到的例子,但是他們沒有按照我想要的方式工作。訪問公共方法的目標c

Class1.h

@interface anything : NSObject { 

    IBOutlet NSTextField *label; 

} 

+ (void) setLabel:(NSString *)string; 
- (void) changeLabel:(NSString *)string2; 

Class1.m

+ (void) setLabel:(NSString *)string { 

    Class1 *myClass1 = [[Class1 alloc] init]; 

    [myClass1 changeLabel:string]; 
    NSLog(@"setLabel called with string: %@", string); 

} 

- (void) changeLabel:(NSString *)string2 { 

    [label setStringValue:string2]; 
    NSLog(@"changeLabel called with string: %@", string2); 
} 

Class2.m

- (IBAction)buttonPressed { 

    [Class1 setLabel:@"Test"]; 

} 

很奇怪的是,在NSLogs,一切都很好,在這兩個NSLogs,該字符串是「Test」,但textField的stringValue不會更改!

+1

您混淆了類和對象方法。 這個例子並不合理。 你只是暫時在'+ setLabel:'中創建一個對象,但是你永遠不會對它做任何事情/永遠不會返回它。 告訴我你想做什麼,我可以幫你。 – NSAddict

+1

爲什麼使用靜態方法?這是一個單身嗎? –

+0

@RamyAlZuhouri不,它不是單身人士,那需要一個靜態變量。 – NSAddict

回答

7

這裏你可以做什麼簡單的例子:


自定義類

@interface ITYourCustomClass : NSObject 
@property (strong) NSString *title; 

- (void)doSomethingWithTheTitle; 
@end 

@implementation ITYourCustomClass 
- (void)doSomethingWithTheTitle { 
    NSLog(@"Here's my title: %@", self.title); 
} 
@end 

使用它

@implementation ITAppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    ITYourCustomClass *objectOfYourCustomClass = [[ITYourCustomClass alloc] init]; 
    [objectOfYourCustomClass doSomethingWithTheTitle]; 
} 

@end 

類別和對象方法

+聲明方法意味着您可以直接在類上調用該方法。 像你這樣做了[myClass1 setLabel:@"something"];。 這沒有意義。你想要的是創建一個屬性。 屬性保存在一個對象中,因此您可以創建對象ITYourCustomClass *objectOfYourCustomClass = [[ITYourCustomClass alloc] init];並設置屬性objectOfYourCustomClass.title = @"something"。然後您可以撥打[objectOfYourCustomClass doSomethingWithTheTitle];,這是一種公共對象方法。

+0

好吧。我認爲我對這些+有些問題,並且 - 我是mac開發新手,現在開發iPhone應用程序已有2年。我將Class1和Class2連接到兩個不同的nib文件,這兩個文件是加載的,一個包含標籤,另一個包含文本字段,我只想在另一個窗口中使用文本字段更改一個窗口中的標籤。用你給我的例子,我得到和以前完全一樣的東西:NSLogs給我改變了標題,但是如果我從另一個類中調用-doSomethingWithTheTitle,標籤本身不會改變 –

+0

@VincentFriedrich那麼你如何使用Class1和Class2在界面生成器?你通常有一個視圖控制器,或一個窗口控制器來管理這些事情。或者您可以添加對象來連接它們,如初始nib文件中的'AppDelegate'類。 – NSAddict

+0

是的,我添加了一個對象並將其命名爲「Class1」並管理所有內容。在windowController中,我什麼都不做。這是我第一次嘗試一個mac應用程序。我是這樣做的,因爲我使用nsviewcontroller或windowcontroller時遇到了幾個問題 –

0

您試圖通過類方法訪問實例變量。您應該+setLabel:方法轉換爲-setLabel:,並調用它像這樣:

[_myClass1Variable setLabel:@"Test"]; 

此外,什麼是-setStringValue?如果您只是想更改UILabel的文字,您需要致電-setText:

8

-+並不意味着公共或私人

-代表你可以在類的對象調用和

+代表可以在類本身調用的方法的方法。

+0

啊好吧..這是不是從Java不同或我得到一些完全錯誤? –

+0

在objective-c中基本上沒有私有函數...在頭文件中定義的每個函數都是公共的...如果您仍然想要定義私有函數以便在某處提及它們,請在.m中添加一個塊,如上所述在http://stackoverflow.com/a/651852/232812 – Infinite

+0

aaahh非常感謝很高興知道 –

0

我想label將是一個NSTextField,並且您正在設置它的值而不加載該XIB,導致您的awakeFromNib沒有被調用。而且這個插座不會被綁定那label