关于cocoa:Objective c访问公共方法

objective c accessing public method

我尝试从另一个类访问公共方法。我已经尝试了很多我在网上找到的例子,但是它们没有按照我想要的方式工作。

第一类H

1
2
3
4
5
6
7
8
@interface anything : NSObject {

    IBOutlet NSTextField *label;

}

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

1m级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
+ (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);
}

第二类

1
2
3
4
5
- (IBAction)buttonPressed {

    [Class1 setLabel:@"Test"];

}

很奇怪的是,在nslogs中,一切都很好,在两个nslogs中,字符串都是"test",但textfield的stringvalue没有改变!


-+不表示公共或私人

-表示可以调用类对象的方法,并且

+表示可以对类本身调用的方法。


下面是一个简短的示例,说明您可以做什么:

自定义类

1
2
3
4
5
6
7
8
9
10
11
@interface ITYourCustomClass : NSObject
@property (strong) NSString *title;

- (void)doSomethingWithTheTitle;
@end

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

使用它

1
2
3
4
5
6
7
8
9
@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];,这是一个公共对象方法。


我猜label将是一个nstextfield,而您正试图在不加载该xib的情况下设置它的值,这样您的awakefromnib就不会被调用了。出口不受该出口的约束。


您正在尝试使用类方法访问实例变量。您应该将+setLabel:方法转换为-setLabel:方法,并这样调用它:

1
[_myClass1Variable setLabel:@"Test"];

另外,什么是-setStringValue?如果您只是想更改UILabel的文本,您需要调用-setText: