这是一个常见的主题,但在我的情况下,有一件事我不明白,我在其他问题中找不到解释。
以下是我要做的事情的要点:
用户单击一个按钮,会出现类似这样的内容:
@implementation FirstClass
-(void)clickedButton
{
[SecondClass changeText];
}
然后在SecondClass中:
@implementation SecondClass
- (void)changeText {
[myLabel setText:@"text"];
}
因此,当用户点击该按钮时,SecondClass中myLabel
中的文本属性将更改为“text”。
我遇到的唯一问题是在[SecondClass changeText]
的现有实例上调用SecondClass
。由于我没有以编程方式初始化CCNode(它们都是在运行应用程序时自动加载的),因此我不知道SecondClass
的初始化位置和方式。我正在使用SpriteBuilder来构建这个项目。
任何帮助将不胜感激。谢谢!
答案 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 {
这会将方法从实例方法更改为类方法。