0

实际上,我在我的应用程序中命名了三个视图控制器。我从 A 导航到 B,然后从 B 导航到 C。我从 C 调用委托方法,该方法在 A 中实现。这是我的代码

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.mthen 它说undeclared delegate

4

2 回答 2

0

moveToC您分配instanceOfAinstanceOfC. 在moveToC两个实例结束时都被解除分配,因为您不保留对 的强引用instanceOfC,例如将其分配给属性。

您可以通过将 a 添加@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];
于 2017-01-05T13:59:29.493 回答
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 视图控制器中,您再次为 A 视图控制器分配新内存并将委托设置给它。取而代之的是,您需要设置以前在内存中的委托,并且可以通过两种方式找到

(i) 从导航控制器中获取 (ii) 在 B 视图控制器中创建 A 视图控制器的对象。

于 2017-01-05T14:03:45.690 回答