一言以蔽之,怎么做?
我有一个视图控制器,可以创建一些自定义对象。其中一个对象需要在控制器中回调一个方法。对象看起来想要调用控制器中的类方法,这可能没问题,但控制器中的类需要调用控制器中的实例方法,而它似乎并不想这样做。这有意义吗?
如果没有,下面是伪代码:
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吗?我不认为这是可行的。
我的猜测是,我遗漏了一些基本的概念,而且它并不像我制作的那样困难。我很感谢任何能帮我解决问题的人。
非常感谢。
发布于 2009-07-08 03:43:16
没有唯一的正确答案;它取决于您的自定义对象如何与控制器交互。大多数UIKit视图使用“目标-操作”模式与控制器通信,而许多模型对象使用委托模式。您使用哪一个取决于您的控制器和自定义对象的具体情况。
但是,机械地讲,当您通过自定义初始化器创建ViewController时,您可能需要传递一个指向customObj的指针,如下所示:
customObj *customObjInstance = [[customObj alloc] initWithController: self];如果这样做,请确保您的customObj与控制器紧密耦合是有意义的。
发布于 2009-07-08 05:54:43
你可能对我提到过不同的类,但如果你的意思是控制器需要创建可以调用控制器的对象(以创建更多相同的对象),我可以帮助你。
我经常这样做,使用--正如john提到的--委托模式:
定义从对象到控制器的调用的协议: callBack
// CallBackDelegate.h
#import <Foundation/Foundation.h>
@protocol CallBackDelegate<NSObject>
- (void)callBack;
@end在控制器的头文件中,我导入了协议
#import "CallBackDelegate.h"并指定控制器实现此协议:
@interface MyViewController : UIViewController < CallBackDelegate >
{ ... 同时,在自定义对象类头中也导入了协议
#import "CallBackDelegate.h"并添加符合协议的实例成员:
id<CallBackDelegate> delegate;和一个必须赋值而不是保留的属性,否则,控制器和自定义对象将相互保留,这意味着它们永远不会释放。
@property(assign) id<CallBackDelegate> delegate; (此成员不必称为委托)
然后,确保在视图控制器创建自定义对象时,将自身设置为委托
customObject.delegate = self; 然后,在您的自定义对象中,您可以安全地执行以下操作:
[ delegate callBack];希望这能帮上忙,麦特
如果你搜索苹果的示例代码,你会发现类似这样的例子:
委托touchesEnded:touches withEvent:event;
当然,如果您希望该方法将id传递给创建的对象,则该方法不需要像我的示例中那样返回(void
如果你愿意,你可以像john建议的那样编写一个接受委托的init方法
customObj *customObjInstance = [customObj alloc : self];
在initWithController中,需要将传入的控制器指定为委托
https://stackoverflow.com/questions/1096031
复制相似问题