所以这是我的代码:
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。当我运行应用程序时,我得到“在这里测试”而不是“通过”,所以它没有通过它。
任何想法如何解决这个问题?
答案 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)
由于 viewC
是viewA
的子视图,您应该向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
并不是最好再次向viewB
和viewC
发送消息。基于此建议一些变化。
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];
您不必为视图创建对象。您可以按类名直接访问该方法。希望这可以帮助。