自定义委托没有被调用?

时间:2017-01-05 13:34:28

标签: ios objective-c delegates protocols uivewcontroller

实际上我的应用程序中有三个视图控制器。我正在从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

2 个答案:

答案 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的对象。