在Objective C中调用另一个类的方法
我有2个类,说A类和B类。B类是在A类中创build的。我有类A中的方法,需要在类A和类B中执行。调用类A本身的方法是好的。 但我不知道在B类中调用方法。我曾尝试将方法声明为静态方法,但是由于我不能在静态方法中使用实例variables,所以我认为使用委托将是一个好主意。 因为我来自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(); } }
是否有可能使用协议来做到这一点。
我刚刚在研究中看到这个post。 这是一个示例代码:
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
目标C你可能看到了什么
你可以参考这个post 。 但为此,你必须学习Objective C的一些语法。
如果你不熟悉Objective C&不直接处理Cocoa框架工作,那么你可以使用Objective C ++来完成你的工作。 你可以在C ++中编写你的代码。
在这里你可以使用A类的函数指针和传递静态方法。
或者你可以定义接口类。 从A传递A的对象到B的类
你可以让一个class级成为另一个class级的代表,但这是一种任意的关系。
有没有任何理由不使用inheritance – 从Z的A + B子类和Z是你的常用方法? 然后他们都可以打电话给[self calculate];
你可以使用notificationCenter来做到这一点。 例如
A类.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]; }
我很确定你在找什么是块。
在A类中,可以将calculate()定义为块。
然后在B类中,你可以有一种方法来计算块,并根据计算返回一些B的新实例(我假设这是什么意图?)。