如何告诉我的ViewController视图被触摸?

时间:2014-03-05 16:03:27

标签: ios iphone objective-c

我正在浏览斯坦福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];
    }
}

4 个答案:

答案 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];
}