我的主视图PlayGameViewController有一个名为CardViewController的子视图(实际上有2个)。
CardViewController以编程方式创建一些按钮
-(void) initialiseButtons
{
NSLog(@"initialiseButtons %d",totalButtons);
int ypos = playerImage.frame.origin.y + playerImage.frame.size.height + 42;
for(int i=0; i<totalButtons; i++)
{
StatView *sv = [[StatView alloc] initWithYPos:ypos];
sv.tag = 100 + i;
[sv.overlayButton addTarget:self action:@selector(statTapped:)
forControlEvents:UIControlEventTouchUpInside];
sv.overlayButton.tag = 10 + i;
[self.frontView addSubview:sv];
ypos += 26;
}
}
它设置一个回调函数statTapped。这工作正常,函数确实被调用。 但是......所有游戏逻辑都在PlayGameViewController中,所以我需要处理那里的功能。我尝试从CardViewController中删除该函数并在PlayGameViewController中实现它,但调用没有传递给父类。
有没有实现这一点,还是我在说话和思考疯狂?
答案 0 :(得分:0)
我认为你有几个选择:
statTapped:
方法。您可以在此处详细了解代表以及如何创建代表:How do I create delegates in Objective-C? NSNotification
并在PlayGameViewController
中添加一个将调用statTapped:
方法的监听器(也在PlayGameViewController
中定义。然后在CardViewController
中执行您的选择器操作调用发布通知的方法。PlayGameViewController
将收到该通知,然后运行指定的任务。以下是使用NSNotification
:
在PlayGameViewController
的init方法中,写一下:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statTapped:)
name:@"statTapped"
object:nil];
在CardViewController
中,您需要像现在一样为按钮操作设置选择器,但不是statTapped:
,而是需要包含此代码的其他方法:
[[NSNotificationCenter defaultCenter] postNotificationName:@"statTapped"
object:self];
通过这样做,PlayGameController
将拥有statTapped
方法。
不要忘记用viewDidUnload
方法删除观察者:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"statTapped" object:nil];