вызов метода текущего класса из метода другого класса - PullRequest
0 голосов
/ 22 сентября 2010

Я работаю над классом A, у которого есть метод - (void) DoSmthing1.Я делаю вызов другого метода - (void) DoSmthing2 в классе B. Теперь, после выполнения некоторых операций в классе B, метод должен вызывать метод (void) DoSmthing3 предыдущего класса.

Какя буду вызывать метод текущего класса из другого класса?Может кто-нибудь, пожалуйста, помогите мне ....

Заранее спасибо

edit1 :: Мой код: Класс A

{
-(void) MethodA {

}

-(void) MethodB {
   ClassB *clsB = [[ClassB alloc] init];
   [clsB MethodC];
}  
}  

Класс B

{
  -(void)MethodC:(selector) {
  //here i want to call MethodA of classA, and i will prefer if it is possible by sending the name of the method as selector in this method(methodC)

    }  
}

edit2 ::

Еще один пример, который я хочу сделать в следующем порядке:

ClassB *b = [[ClassB alloc] nitWithTarget:self selector:@selector(methodfromClassA) object:nil];

Здесь я хочу вызвать метод класса A, как только какая-то задача в классе B будет завершена, иэто тоже из класса А.

Надеюсь, теперь это очень ясно.

Edit3:

- (void)loadView {
    AsyncConnection *async =[[AsyncConnection alloc] init];
    [async getAsync:self callback:@selector(test1)];
}

Код выше из первого класса *Код 1027 *

-(void)getAsync:(id)anObject callback:(SEL)selector {
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:anObject 
                                                                            selector:@selector(selector) 
                                                                              object:nil];
    [queue addOperation:operation];
    [operation release];

}

и выше относится ко второму классу.Здесь я хочу вызвать метод первого класса, который передается как селектор.

Ответы [ 4 ]

2 голосов
/ 23 сентября 2010
- (void)loadView {
    AsyncConnection *async =[[AsyncConnection alloc] init];
    [async getAsync:self callback:@selector(test1)];
}

Другой класс:

-(void)getAsync:(id)anObject callback:(SEL)selector {
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
         initWithTarget:anObject 
               selector:@selector(selector)
                 object:nil];

    [queue addOperation:operation];
    [operation release];

}

Сначала, если вы хотите использовать вышеуказанный шаблон, удалите @selector() из @selector(selector).У вас уже есть селектор.Выполнение @selector(selector) создаст SEL с именем selector, а не селектор, переданный в качестве аргумента.

Далее, это кажется странным шаблоном для начала;это будет работать, но любой опытный разработчик Obj-C / iOS / Cocoa заставит завсегдатаев взглянуть на это.Поскольку вы написали класс AsyncConnection, используйте шаблон делегата.Т.е. в классе, который реализует loadView.

То есть в AsyncConnection.h:

@property(retain) ClassA *callbackHandler;

А потом:

- (void)loadView {
    AsyncConnection *async =[[AsyncConnection alloc] init];
    [async setCallbackHandler: self];
}

Затем в AsyncConnection,вы бы обращались к обработчику обратного вызова напрямую как self.callbackHandler (или [self callbackHandler]).

2 голосов
/ 22 сентября 2010

Похоже, что вам было бы полезно прочитать вступительный материал: Язык программирования Objective-C и Руководство по основам какао . Кроме того, вам следует ознакомиться с основами объектно-ориентированного программирования (в Интернете и в Amazon есть десятки обзоров).

По сути, вы путаете класс (проект для создания объекта, в его самом основном описании) и экземпляр класса (фактический "экземплярный" объект данного класса). Где-то вам понадобится ссылка из одного экземпляра в другой (например, objectB = [[ClassB alloc] init]) для отправки сообщения (например, [objectB doSomethingAnObjectOfClassBWouldDo]). Этого можно достичь, сохранив ссылку в качестве переменной экземпляра или внутри коллекции (массива, словаря и т. Д.), Которая является переменной экземпляра класса, которому необходимо «запомнить», с кем нужно поговорить.

Важно понимать, что вы пытаетесь ходить, прежде чем научиться ползать с этой платформой. Единственное лекарство - учиться. Много. Путеводители Справка.

1 голос
/ 22 сентября 2010

Тогда новый подход: Должно быть что-то вроде:

classB.h

classA *aObj;

@property(nonatomic, retain) classA *aObj;

classB.m

@synthetize aObj;

classA.m

// after init class b obj

[bOjb setAObj:self];

classB.m

[aObj whateverMethodOfClassA];

Дайте мне знать, если не ясно.

Мое предположение: в общем, если вы хотите избежать реального беспорядка и кошмара для отладки, вы должны использовать наблюдатели и уведомления, а не вызовы такого рода перекрестных методов.

Сделать класс A наблюдателем уведомления класса B:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(classA-method-name:) name:@"notification-name" object:class-B-object ];

И когда будете готовы в классе B, уведомите класс A с пармами:

[[NSNotificationCenter defaultCenter] postNotificationName:@"notification-name" object:self];

Просто идея.

0 голосов
/ 22 сентября 2010

Один из вариантов - использовать шаблон делегата в Objective C. Пусть объект класса A передает себя объекту класса B для обработки определенных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...