9

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

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 没有改变!

4

4 回答 4

14

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

-代表您可以在类的对象上调用的方法,并且

+代表可以在类本身上调用的方法。

于 2012-12-21T12:52:26.417 回答
8

这是您可以执行的操作的简短示例:


自定义类

@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];,这是一个公共对象方法。

于 2012-12-21T12:54:17.290 回答
0

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

[_myClass1Variable setLabel:@"Test"];

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

于 2012-12-21T12:50:11.193 回答
0

我想label这将是一个 NSTextField,并且您正在尝试在不加载该 XIB 的情况下设置其值,从而导致您的 awakeFromNib 没有被调用。并且插座不会被那个束缚label

于 2012-12-21T12:52:27.870 回答