首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例方法调用类方法调用实例方法

问实例方法调用类方法调用实例方法
EN

Stack Overflow用户
提问于 2009-07-08 03:37:07
回答 2查看 1.2K关注 0票数 5

一言以蔽之,怎么做?

我有一个视图控制器,可以创建一些自定义对象。其中一个对象需要在控制器中回调一个方法。对象看起来想要调用控制器中的类方法,这可能没问题,但控制器中的类需要调用控制器中的实例方法,而它似乎并不想这样做。这有意义吗?

如果没有,下面是伪代码:

代码语言:javascript
复制
ViewController.m

#import "customObj.h"
-(void)viewDidLoad{
  foobar=@"string";//declared in ViewController.h
}
-(void)createObj{
  foobar=@"different string";
  customObj *customObjInstance=[[customObj alloc] init];
}

---

customObj.m

#import "ViewController.h"
-(void)callBack{
  [ViewController createObj];
}

好吧,所以当callBack运行时,它会出错,说它正在寻找+createObj (而不是-createObj)。我可以将createObj更改为类方法,但是设置foobar会出现问题,因为foobar是在-viewDidLoad中初始化的,而我不能将其更改为+viewDidLoad。我也许可以将foobar移出到一个类方法中,但是我该如何调用它呢?我指的是ViewController而不是self吗?我不认为这是可行的。

我的猜测是,我遗漏了一些基本的概念,而且它并不像我制作的那样困难。我很感谢任何能帮我解决问题的人。

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-08 03:43:16

没有唯一的正确答案;它取决于您的自定义对象如何与控制器交互。大多数UIKit视图使用“目标-操作”模式与控制器通信,而许多模型对象使用委托模式。您使用哪一个取决于您的控制器和自定义对象的具体情况。

但是,机械地讲,当您通过自定义初始化器创建ViewController时,您可能需要传递一个指向customObj的指针,如下所示:

代码语言:javascript
复制
customObj *customObjInstance = [[customObj alloc] initWithController: self];

如果这样做,请确保您的customObj与控制器紧密耦合是有意义的。

票数 5
EN

Stack Overflow用户

发布于 2009-07-08 05:54:43

你可能对我提到过不同的类,但如果你的意思是控制器需要创建可以调用控制器的对象(以创建更多相同的对象),我可以帮助你。

我经常这样做,使用--正如john提到的--委托模式:

定义从对象到控制器的调用的协议: callBack

代码语言:javascript
复制
//  CallBackDelegate.h


#import <Foundation/Foundation.h>

@protocol CallBackDelegate<NSObject>
- (void)callBack;
@end

在控制器的头文件中,我导入了协议

代码语言:javascript
复制
#import "CallBackDelegate.h"

并指定控制器实现此协议:

代码语言:javascript
复制
@interface MyViewController : UIViewController < CallBackDelegate > 
{ ...   

同时,在自定义对象类头中也导入了协议

代码语言:javascript
复制
#import "CallBackDelegate.h"

并添加符合协议的实例成员:

代码语言:javascript
复制
id<CallBackDelegate> delegate;

和一个必须赋值而不是保留的属性,否则,控制器和自定义对象将相互保留,这意味着它们永远不会释放。

代码语言:javascript
复制
@property(assign) id<CallBackDelegate> delegate;  

(此成员不必称为委托)

然后,确保在视图控制器创建自定义对象时,将自身设置为委托

代码语言:javascript
复制
customObject.delegate = self; 

然后,在您的自定义对象中,您可以安全地执行以下操作:

代码语言:javascript
复制
[ delegate callBack];

希望这能帮上忙,麦特

如果你搜索苹果的示例代码,你会发现类似这样的例子:

委托touchesEnded:touches withEvent:event;

当然,如果您希望该方法将id传递给创建的对象,则该方法不需要像我的示例中那样返回(void

如果你愿意,你可以像john建议的那样编写一个接受委托的init方法

customObj *customObjInstance = [customObj alloc : self];

在initWithController中,需要将传入的控制器指定为委托

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1096031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档