2014-10-01 54 views
0

这是一个常见的主题,但在我的情况下,有一件事我不明白,我无法在其他问题中找到解释。调用另一个类的方法而不创建新的实例

这里是我想要做的要点:

用户点击一个按钮,这样的事情被称为:

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

然后在二等是:

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

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

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

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

+1

我想弄清楚你需要在这里学习什么...也许网点?你不想初始化一个新的对象,但有些已经存在,通过你的标题,我认为你需要了解类方法... – 2014-10-01 00:39:29

+1

是的,这是一个伟大的混乱,特别是[超级初始化]部分。请描述你正在努力达到的目标,因为即使是目前的努力也没有给出任何线索。 :) – user3125367 2014-10-01 00:48:43

+0

请检查答案,我想,这是你在找什么。 – 2014-10-01 01:00:44

回答

0

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

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

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

@property(weak) SecondClass *secondInstance; 

然后在按钮按下方法:

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

有一个问题留给:谁负责设置第一个实例的属性我们定义了什么?这取决于谁创建了他们两个,可能只是应用程序委托或封装控制器,你知道更好。

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; 

    ... 
} 

注意,类是不相同的对象(实例)。类是一个命名的方法集合,主要用于实例。在Objective-C中,类不仅仅是一个名称,而且也是一个对象,所以你可以调用一个方法(例如,发送一条消息到类对象)。但在这里我们总是谈论对象(实例),所以忘掉类 - 我们通过强属性或弱插口来持有对象,这取决于它们是如何创建的,并且在对象上操作,而不是在类上操作。

+0

啊谢谢你。它是在应用程序委托中创建的。因此,要设置'secondInstance',我明白我需要从应用程序委托中设置它,但是如何从应用程序委托中引用FirstClass?应用程序委托不会创建用于初始化FirstClass的任何代码,因此我不确定如何引用它。我试图创建'@property FirstClass * firstClass',但显然我需要将该属性设置为'FirstClass',否则它将为零。将属性设置为'FirstClass'是我想要解决的方法,因为我需要定义'FirstClass'来访问它的属性。 – SaleenS7 2014-10-01 19:38:53

+0

想通了这个:http://stackoverflow.com/questions/24759662/cocos2d-v3-ios-how-to-access-runningscene-from-app-delegate欣赏它:) – SaleenS7 2014-10-01 20:02:04

+0

一个问题:我到底该如何从应用程序代理去设置'secondInstance'?它就像'firstClass.secondInstance = ____'一样,在空白处是SecondClass,但我想弄清楚如何获得SecondClass。如果这是有道理的。很难解释 – SaleenS7 2014-10-01 20:10:25

-2

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

@implementation SecondClass 
- (id)changeText { 

@implementation SecondClass 
+ (id)changeText { 

这样的方法,从一个实例方法更改为类方法。

+0

我会使用类方法,但我不能在它们中使用实例变量。除非有某种解决方法 – SaleenS7 2014-10-01 01:01:10

+0

您可以将所需的变量作为参数传递给方法。 – 2014-10-01 01:05:48

+0

CCLabelTTF还可以通过吗?困难在于我试图更新在'SecondClass'中实例化的'myLabel'。它在头文件中被实例化为@属性。而且我无法从'FirstClass'传入'myLabel' – SaleenS7 2014-10-01 01:24:24

相关问题