我正在浏览斯坦福iOS课程并且有一些设计问题。在课堂上我们正在制作卡片匹配游戏,在屏幕上有大约20张卡片。我最近制作了UIViews卡片,所以我可以正确地绘制它们。
我给了他们每个方法tap
,它会将faceUp
交换为YES / NO,从而翻转卡片。我在我的ViewController中为每个添加了手势识别器,它可以工作。个人卡片知道他们何时被触摸和翻转。
但是,我需要在我的ViewController中知道已经触摸了一个cardView ......以及哪一个。
我如何/以何种方式执行此操作?我可以在我的View中播放ViewController将要监听的内容吗?我可以使用轻触的viewController句柄(但如果我这样做,有没有办法获取发送视图?)我很抱歉,如果这是真正的基础,但我是iOS的新手并且不希望通过修补和实现来学习一个破碎的MVC模式。
编辑:仅供参考,这是我的最终实施。
每个CardView上都有一个水龙头识别器。当识别出点击时,它会调用:
- (void)cardTapped:(UIGestureRecognizer *)gesture
{
UIView *view = [gesture view]; // This method is what I was looking for.
if ([view isKindOfClass:[PlayingCardView class]]) {
PlayingCardView *playingCardView = (PlayingCardView *)view;
[playingCardView flip]; // flips card
// Game code
if (!self.game.hasStarted) {
[self startGame];
}
int cardIndex = [self.cardViews indexOfObject:playingCardView];
[self.game chooseCardAtIndex:cardIndex];
[self updateUI];
}
}
答案 0 :(得分:1)
您可以使用touchesBegan方法来检测点击了哪个视图。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
NSLog(@"%d", [touch view].tag); // Considering you have set tags for your UIViews..
if([touch view] == cardView1) // Considering you have a view as cardView1
{
NSLog(@"cardView1 is tapped");
}
}
答案 1 :(得分:1)
tag
属性会告诉您哪个视图已被点按。在创建视图时设置正确的标记,并且在您点击时触发的操作方法中,您可以调用委托方法,该方法将通知您的代理已经过了哪个视图。使您的viewcontroller具有委托,它将收到通知。
// your target method will look like this:
- (void) didTap:(id)sender {
//... your code that handle flipping the card
[self.delegate didTapOnCard:self]; // where delegate is your view controller
}
答案 2 :(得分:0)
在UIView
卡片类中添加
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)e {
UITouch *touch = [touches anyObject];
if ([self pointInside:[touch locationInView:self] withEvent:nil]) {
[self touchesCancelled:touches withEvent:e];
// Add your card flipping code here
}
}
答案 3 :(得分:0)
广播方法:在您的UIView的tap
方法中,发送通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"cardTapped" object:self userInfo:@{ @"card": @(self.cardId), @"faceUp": @(self.faceup) }];
并在您的ViewController中订阅该通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cardTapped:) name:@"cardTapped" object:nil];
并实施
-(void)cardTapped:(NSNotification*)notification
{
int card = [[notification.userInfo objectForKey:@"card"] intValue];
BOOL faceUp = [[notification.userInfo objectForKey:@"faceUp"] boolValue];
}