在没有创建新实例的情况下从另一个类调用方法

时间:2014-10-01 00:33:51

标签: objective-c spritebuilder

这是一个常见的主题,但在我的情况下,有一件事我不明白,我在其他问题中找不到解释。

以下是我要做的事情的要点:

用户单击一个按钮,会出现类似这样的内容:

@implementation FirstClass
-(void)clickedButton
{
    [SecondClass changeText];
}

然后在SecondClass中:

@implementation SecondClass
- (void)changeText {
         [myLabel setText:@"text"];
}

因此,当用户点击该按钮时,SecondClass中myLabel中的文本属性将更改为“text”。

我遇到的唯一问题是在[SecondClass changeText]的现有实例上调用SecondClass。由于我没有以编程方式初始化CCNode(它们都是在运行应用程序时自动加载的),因此我不知道SecondClass的初始化位置和方式。我正在使用SpriteBuilder来构建这个项目。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

所以,你有两个实例 - 一个带按钮,另一个带标签。我假设它们都是NSViewController的后代或以其他方式管理底层视图。

问题是,你发现无法从第一个实例的方法中解决包含标签的第二个实例。

您需要在第一个实例的类中定义属性:

@property(weak) SecondClass *secondInstance;

然后按下按钮的方法:

-(void)clickedButton
{
    [self.secondInstance changeText];
}

还有一个问题:谁负责设置我们定义的第一个实例的属性?这取决于谁创建了它们,可能只是app委托或封闭控制器,你知道更好。

UPD:如果两个控制器都是由AppDelegate创建的:

#import "FirstClass.h"
#import "SecondClass.h"

@interface AppDelegate ()

// case A - manual
@property(strong) FirstClass *firstInstance;
@property(strong) SecondClass *secondInstance;

// case B - declared in xib
//@property(weak) IBOutlet FirstClass *firstInstance;
//@property(weak) IBOutlet SecondClass *secondInstance;

@end

@implementation AppDelegate

...

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    // Create them
    self.firstInstance = [[FirstClass alloc] init...];
    self.secondInstance = [[SecondClass alloc] init...];
    // Or maybe they are declared in MainMenu.xib, then you do not create them
    // by hand, but must have outlets for both. See case B above.

    // Connect them
    self.firstInstance.secondInstance = self.secondInstance;

    ...
}

请注意,类与对象(实例)不同。 Class是一个命名的方法集合,主要用于实例。在Objective-C中,类不仅是一个名称,也是一个对象,因此您可以在其上调用一个方法(即将消息发送到类对象)。但是在这里我们总是谈论对象(实例),所以忘记类 - 我们通过强属性或弱插座来保存对象,具体取决于它们的创建方式,对对象进行操作,而不是对类进行操作。

答案 1 :(得分:-2)

在目标C中,方法是实例方法或类方法。顾名思义,实例方法需要类的实例才能工作,而类方法只能使用类的名称。你需要的是一个类方法。只需更改代码中的以下行:

@implementation SecondClass
- (id)changeText {

@implementation SecondClass
+ (id)changeText {

这会将方法从实例方法更改为类方法。