总之,怎么样?
我有一个视图控制器,可以创建一些自定义对象。其中一个对象需要在控制器中调用一个方法。该对象看起来好像要在控制器中调用一个类方法,这可能没问题,除了控制器中的类需要调用控制器中的实例方法,并且它似乎不想这样做。这有意义吗?
如果没有,这是伪代码:
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 ...]?我觉得这不行。
我的猜测是我错过了一些基本的概念,并不像我正在做的那样困难。我感激任何能够理顺我的人。
非常感谢。
答案 0 :(得分:5)
没有一个正确答案;它取决于您的自定义对象如何与控制器交互。大多数UIKit视图使用“目标 - 动作”模式与控制器进行通信,而许多模型对象使用委托模式。您使用哪一个取决于控制器和自定义对象的具体情况。
但是,机械地,您可能需要做的是在通过自定义初始化程序创建ViewController
时传递指向customObj
的指针,如下所示:
customObj *customObjInstance = [[customObj alloc] initWithController: self];
如果你这样做,请确保customObj
与你的控制器紧密耦合是有意义的。
答案 1 :(得分:3)
你可能已经向我提出了各种类的提及,但是如果所有你的意思是控制器需要创建可以调用控制器的对象(创建更多相同的),我可以帮助你有。
我这样做了很多,正如约翰所提到的那样 - 使用委托模式:
为从对象到控制器的调用定义协议: 回调
// 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:触及withEvent:event];
当然,如果您希望方法将id传递给创建的对象,则该方法不需要像我的示例中那样返回(void)
如果你愿意,你可以编写一个init方法,该方法将代理作为john也建议
customObj * customObjInstance = [[customObj alloc] initWithController:self];
在initWithController中,您传入的控制器需要被指定为委托