实际上我的应用程序中有三个视图控制器。我正在从A导航到B然后从B导航到C.我在C中调用委托方法,这是在A中实现的。 这是我的代码
'meta_query' => array(
array(
'key' => 'event_start_date',
'value' => '2017-01-01', //I've hard-coded this to test with
'compare' => '>=',
'type' => 'DATE'
),
)
A.h
在#import "A.h"
#import "C.h"
我有
A.m
在@interface A()<delegateName>
-(void)delegateMethod
{
NSLog(@"delegate");
}
-(void)moveToB
{
C *instanceOfC=[C alloc] init];
instanceOfC.delegate=self; //line 1
}
B.h
在#"import C.h"
B.m
在-(void)moveToC
{
A *instanceOfA=[[A alloc] init];
C *instanceOfC=[[C alloc] init];
instanceOfC.delegate= instanceOfA; //line 2
}
C.h
在@protocal delegateName <NSObject>
-(void)delegateMethod;
@end
@interface C
@property(nonatomic,weak) id<delegateName> delegate;
@end
C.m
如果我将@synthesize delegate;
-(void)inSomeMethod
{
[delegate delegateMethod];
}
放在<delegateName>
而不是A.h
,那么它会显示A.m
。
答案 0 :(得分:0)
在moveToC
中,您要将instanceOfA
分配给instanceOfC
的委托属性。在moveToC
结束时,两个实例都被取消分配,因为您没有强烈引用instanceOfC
,例如将它分配给一个财产。
您可以通过向@property (strong, nonatomic) C *cInstance;
类添加B.m
并在实例化instanceOfC
时分配它来解决此问题:
-(void)moveToC {
A *instanceOfA=[[A alloc] init];
self.cInstance = [[C alloc] init];
self.cInstance.delegate= instanceOfA;
}
那就是说,设计看起来不对我。我会将delegateProtocol
重命名为其他内容,例如DirtyJobHandler
,并在课程init
中引入自定义C
方法:
- (instanceType)initWithDirtyJobHandler:id<DirtyJobHandler> dirtyJobHandler {
self = [super init];
if (self) {
self.dirtyJobHandler = dirtyJobHandler //previous knonw as self.delegate
}
}
能够注入这种依赖:
[[C alloc] initWithDirtyJobHandler:instanceOfA];
答案 1 :(得分:0)
我认为问题在于
A *instanceOfA=[[A alloc] init];
中的函数
-(void)moveToC
{
A *instanceOfA=[[A alloc] init];
C *instanceOfC=[[C alloc] init];
instanceOfC.delegate= instanceOfA;
}
用
替换第一行 A *instanceofA = self.navigationController.viewControllers[indexofA]
在B viewcontroller中,您再次为Viewcontroller分配新内存并将委托设置为它。而不是你需要设置以前在内存中的委托,并且可以通过两种方式找到
(i)从导航控制器获取它 (ii)在B viewcontroller中创建一个Viewcontroller的对象。