Вызов метода из другого класса в Objective C - PullRequest
3 голосов
/ 09 марта 2012

У меня есть 2 класса, скажем, класс A и класс B. Класс B создан в классе A. У меня есть метод в классе A, который должен выполняться как в классе A, так и в классе B. Вызов метода в самом классе A - это нормально. Но я не уверен насчет вызова метода в классе B. Я пытался объявить метод как статический, но поскольку я не могу использовать переменные экземпляра внутри статического метода, я думаю, что использование делегатов было бы хорошей идеей. Поскольку я из C # фона, я не уверен, использовать ли его в Objective C. Концептуально, я реализовал то, что мне нужно в C #, как показано ниже. Просто хотел узнать, какой это будет эквивалент в Цели C.

class A
{

    public A()
    {
        B myclass = new B(() => calculate());                
    }

    public void calculate()
    {
        // todo
    }
}

class B
{
    public B(Action calculate)
    {
        calculate();
    }
}

Возможно ли это сделать с помощью протоколов.

Ответы [ 5 ]

8 голосов
/ 05 июня 2012

Мне довелось увидеть этот пост во время исследования.Пример кода:

Файл ClassA.h:

#import <Foundation/Foundation.h>
#import "ClassB.h"

@interface ClassA : NSObject <ClassBDelegate>
@end

Файл ClassA.m:

#import "ClassA.h"
@implementation ClassA
-(void)createAnInstanceOfClassB
{
    ClassB *myClassB = [[ClassB alloc]init];  //create an instance of ClassB
    myClassB.delegate = self;  //set self as the delegate
//    [myClassB optionalClassBMethod];  //this is optional to your question.  If you also want ClassA to call method from ClassB
}

-(void)calculate
{
    NSLog(@"Do calculate thing!");  // calculate can be called from ClassB or ClassA
}

@end

Файл ClassB.h:

#import <Foundation/Foundation.h>
@protocol ClassBDelegate <NSObject>
-(void)calculate;   //method from ClassA
@end

@interface ClassB : NSObject
@property (assign) id <ClassBDelegate> delegate;
//-(void)optionalClassBMethod;   //this is optional to your question.  If you also want ClassA to call method from ClassB
@end

Файл ClassB.m:

#import "ClassB.h"
@implementation ClassB
@synthesize delegate;

-(void)whateverMethod
{
    [self.delegate calculate];  // calling method "calculate" on ClassA
}

//-(void)optionalClassBMethod   //this is optional to your question.  If you also want ClassA to call method from ClassB
//{
//    NSLog(@"optionalClassBMethod");
//    [self whateverMethod];
//}

@end
1 голос
/ 09 марта 2012

То, что вы ищете, возможно с Целью C.

Вы можете сослаться на этот пост . Но для этого вам нужно изучить синтаксис Objective C.

Если вы не знакомы с Objective C и не имеете прямого отношения к фреймворку Cocoa, то вы можете выполнять свою работу, используя Objective C ++. Где вы можете написать свой код на C ++.

Здесь вы можете использовать указатель на функцию и передавать статический метод класса A.

Или вы можете определить класс интерфейса. Получите класс A из этого & передайте объект A в класс B.

0 голосов
/ 09 марта 2012

Я почти уверен, что вы ищете блоки.

В классе A вы можете определить calc () как блок.

Тогда в классе B у вас может быть какой-то метод, который принимает блок для вычисления и возвращает какой-то новый экземпляр B на основе вычисления (я предполагаю, что это было предназначено?).

0 голосов
/ 09 марта 2012

Вы можете сделать это, используя Центр уведомлений. * 1001 например *

Класс А .h

@interface A: UIViewController
-(void)classAandBMethod;
@end

.m

@implementation
-(void)willPushToClassB
{
 [[NSNotificationCenter defaultCenter] removeObserver:self];
 [[NSNotificationCenter defaulCenter] addObserver:self selector:@selector(classAandBMethod) name:@"classAandBMethod_name" object:nil];
 //push class B
 ClassB *b = [ClassB alloc] initWithNibName:@"ClassB" ........];
 [self.navigationController pushViewController:b animated:YES];
}
@end

при вызове метода в ClassB:

//this method in classB will call the method in Class a.
-(void)callMethodInClassA{
 NSNotification *subject = [NSNotification defaultCenter];
 [subject postNotificationName:@"classAandBMethod_name" object:nil userinfo:whatEverInfoYouWant_dict];
 [subject removeObserver:self];
}
0 голосов
/ 09 марта 2012

Вы можете сделать один класс делегатом другого, но это своего рода произвольные отношения.

Есть ли причина не использовать наследование - и подкласс A + B от Z - и Z - это ваш общий метод?Тогда они оба могли бы позвонить [self calculate];

...