不在类之间传递的方法

时间:2011-05-20 18:45:10

标签: iphone objective-c class

所以这是我的代码:

ViewA.h:

#import "ViewB.h"
#import "ViewC.h"

@interface ViewA : UIViewController {

    ViewB *viewB;
    ViewC *viewC;

}

@property(nonatomic,retain) ViewB *viewB;

@end

ViewA.m:

@synthesize viewB;

-(void)viewDidLoad {
viewB = [[ViewB alloc] initWithFrame:CGRectMake(0, 0, 320, 328)];
    [self.view addSubview:viewB];

   viewC = [[ViewC alloc] initWithFrame:CGRectMake(0, 332, 320, 84)];
    [self.view addSubview:viewC];

    }

ViewB.h:

-(void)methodToPass;

ViewB.m:

-(void)methodToPass {

NSLog(@"Passed.");
}

ViewC.h:

#import "ViewB.h"

@interface ViewC : UIScrollView {

ViewB *viewB;

}

-(void)methodWhichDoesGetPassed;

ViewC.m:

#import "ViewA.h"

@implementation ViewC

ViewA *viewA;

-(void)methodWhichDoesGetPassed {
NSLog(@"Test here");
[viewA.viewB methodToPass];

}

所以关键的一点是我试图将方法传递给viewB,从viewC到最后一部分的viewA。当我运行应用程序时,我得到“在这里测试”而不是“通过”,所以它没有通过它。

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

所以你的代码很好。唯一的问题是viewC没有指向viewA的指针。或者至少,它没有指向实际存在于内存中的viewA实例的指针。

您已分配并实例化ViewA实例。然后实现ViewB和ViewC的实例。但是,viewC必须查看的指针不会去任何地方。

所以你可以做一些不同的事情。你可以使viewA上的方法成为一个类方法而不是实例方法。 (你可以通过在方法声明前加一个+而不是 - 来做到这一点,或者你可以将viewC传递给viewA。

例如,将viewC中的变量“viewA”赋予setter。并将viewA设置为“self”作为此值。这样,当viewC调用该指针时,它将引用回ViewA的有效实例。

当你写

“ViewA * viewA;”

创建指针或键入ViewA。 btu指针不指向任何地方。

如果你在代码中抛出断点并在调试器中查看viewA,你会看到它的0x0。 (意思是它在内存中不存在)

答案 1 :(得分:1)

由于viewCviewA的子视图,您应该向superview发送消息。

将其更改为

ViewA *view = (ViewA *)self.superview;

[view.viewB methodToPass];

修改

您甚至可以在投射前检查超级视图是否为ViewA的实例。

if ( [self.superview isMemberOfClass:[ViewA class]] ) {
    ViewA *view = (ViewA *)self.superview;
    [view.viewB methodToPass];
}

<击> EDIT2

在实例化时,将viewA传递给viewB并不是最好再次向viewBviewC发送消息。基于此建议一些变化。

ViewA.m:

@synthesize viewB;

-(void)viewDidLoad {
    viewB = [[ViewB alloc] initWithFrame:CGRectMake(0, 0, 320, 328)];
    [self.view addSubview:viewB];

    viewC = [[ViewC alloc] initWithFrame:CGRectMake(0, 332, 320, 84)];
    viewC.viewB = viewB;
    [self.view addSubview:viewC];

}

ViewC.h:

#import "ViewB.h"

@interface ViewC : UIScrollView {
    ViewB *viewB;
}
@property (nonatomic, retain) ViewB *viewB;

-(void)methodWhichDoesGetPassed;
...
@end

ViewC.m:

@implementation ViewC

@synthesize viewB;

-(void)methodWhichDoesGetPassed {
    NSLog(@"Test here");
    [viewB methodToPass];

}

原始答案

答案 2 :(得分:1)

您可以做的是,将 methodToPass 声明为静态

// ViewB.h

+(void)methodToPass;  

// ViewB.m

+(void)methodToPass  
{  
// Your code  
}  

现在,您在 ViewC.m 中以

方式访问该方法
[ViewB methodToPass];  

您不必为视图创建对象。您可以按类名直接访问该方法。希望这可以帮助。