2014-10-01 2 views
0

Это общая тема, но в моем случае есть одна вещь, которую я не понимаю, что не могу найти объяснение в других заданных вопросах.Вызов метода из другого класса БЕЗ создания нового экземпляра

Вот суть того, что я пытаюсь сделать:

Пользователь нажимает на кнопку, и что-то вроде это называется:

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

, а затем в SecondClass является:

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

Итак, когда пользователь нажимает кнопку, свойство text в myLabel в SecondClass изменяется на «текст».

Единственная проблема, с которой я сталкиваюсь, - это позвонить [SecondClass changeText] на существующий экземпляр SecondClass. Поскольку я не инициализирую CCNodes программно (они все автоматически загружаются при запуске приложения), я не знаю, где и как инициализируется SecondClass. Я использую SpriteBuilder для создания этого проекта.

Любая помощь будет оценена по достоинству. Благодаря!

+1

Я пытаюсь выяснить, что вам нужно узнать здесь ... Может быть, розетки? Вы не хотите инициализировать новый объект, но некоторые уже существуют, по вашему названию я думал, что вам нужно узнать о методах класса ... –

+1

Да, это отличный беспорядок, особенно с частью [super init]. Пожалуйста, опишите, чего вы пытаетесь достичь, потому что даже представленные усилия не дали никаких оснований для этого. :) – user3125367

+0

Пожалуйста, проверьте ответ, я думаю, это то, что вы искали. –

ответ

0

Итак, у вас есть две вставки - одна с кнопкой и одна с меткой. Я предполагаю, что они оба являются потомками 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, поэтому я не уверен, как это сослаться на него. Я попытался создать «первоклассный FirstClass» firstClass', но, очевидно, мне нужно установить это свойство в «FirstClass», иначе он будет равен нулю. Установка свойства 'FirstClass' - это то, что я пытаюсь понять, как это сделать, потому что мне нужно определить' FirstClass', чтобы иметь возможность доступа к его свойствам. – SaleenS7

+0

Выяснил это следующим образом: http://stackoverflow.com/questions/24759662/cocos2d-v3-ios-how-to-access-runningscene-from-app-delegate Оцените это :) – SaleenS7

+0

Один вопрос: как именно я переходите к настройке 'secondInstance' из делегата приложения? Это что-то вроде 'firstClass.secondInstance = ____' И в бланке будет SecondClass, но я пытаюсь выяснить, как получить SecondClass. Если это имеет смысл. Это трудно объяснить – SaleenS7

-2

В объекте C методы являются либо методами экземпляра, либо методами класса. Как следует из названия, методы экземпляра требуют, чтобы экземпляр класса работал, тогда как методы класса могут использоваться только с именем класса. Здесь вам нужен метод класса. Просто измените следующую строку в коде:

@implementation SecondClass 
- (id)changeText { 

в

@implementation SecondClass 
+ (id)changeText { 

Это изменит метод от метода экземпляра к методу класса.

+0

Я бы использовал методы класса, но я не могу использовать в них переменные экземпляра. Если не существует какой-либо работы с этим – SaleenS7

+0

Вы можете передать требуемую переменную в качестве аргумента для метода. –

+0

Можно ли пройти через CCLabelTTF? Дилемма в том, что я пытаюсь обновить 'myLabel', который создается в' SecondClass'. Он создается как '@ property' в файле заголовка. И я не могу передать 'myLabel' из' FirstClass' – SaleenS7

Смежные вопросы