从子类调用控制器混淆的方法

时间:2012-05-13 19:17:20

标签: objective-c

我的ViewController中有一个添加图像视图的方法。图像视图又被子类化为可拖动的。触摸时,子类触发ViewController中的方法(spawnImage)以生成新图像。如果我在ViewController中的任何其他位置调用此方法,则会正确绘制图像,但是如果调用源自子类,则调用该方法,NSLog可以工作,但图像不会显示。

似乎我在子类中创建ViewController的另一个实例,最后将图像添加到该实例而不是实际显示的实例。

我怎么解决这个问题?

UIImageView的子类:

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
…
ViewController *viewController = [[ViewController alloc] init];
[viewController checkIfImageIsInOriginalPosition:selfCenter letterIndex: imgTag];
}

ViewController.m:

-(void)checkIfImageIsInOriginalPosition:selfCenter letterIndex: imgTag {
…
else {
[self spawnImage];
}
}

-(void)spawnImage {
…
NSLog(@"Received");
SubClass *subClass = [[SubClass alloc] initWithFrame:frame];
[subClass setImage:image];
[self.view addSubview:subClass];
}

1 个答案:

答案 0 :(得分:1)

此代码:

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
ViewController *viewController = [[ViewController alloc] init];
[viewController checkIfImageIsInOriginalPosition:selfCenter letterIndex: imgTag];
}

..错了。

可能这是Subclass中的代码,是UIImageView的子类,当用户点击它时会被调用。

您不应该分配/初始化新的视图控制器。相反,您应该在SubClass UIImageView子类中设置“owningViewController”属性,并在创建SubClass实例时设置该属性:

-(void)spawnImage 
{
  …
  NSLog(@"Received");
  SubClass *subClass = [[SubClass alloc] initWithFrame:frame];
  owningViewController = self;
  [subClass setImage:image];
  [self.view addSubview:subClass];
}

然后你的SubClass类的touchesBegan方法将如下所示:

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{
  …
  [self.owningViewController checkIfImageIsInOriginalPosition:selfCenter 
    letterIndex: imgTag];
}