5

好的,我在 Xcode 4.5/iOS 6 上使用选项卡式应用程序模板测试了以下内容。

  1. 创建了一个选项卡式应用程序。
  2. 创建了一个名为 SampleButton 的 UIButton 子类,并实现了以下方法:

    - (void)touchesBegan:(NSSet *)touches
               withEvent:(UIEvent *)event
    {
        [super touchesBegan:touches withEvent:event];
    }
    
    - (void)touchesCancelled:(NSSet *)touches
                   withEvent:(UIEvent *)event
    {
        [super touchesCancelled:touches withEvent:event];
    }
    
    - (void) touchesMoved:(NSSet *)touches
                withEvent:(UIEvent *)event
    {
        [super touchesMoved:touches withEvent:event];
    }
    
    - (void)touchesEnded:(NSSet *)touches
               withEvent:(UIEvent *)event
    {
        [super touchesEnded:touches withEvent:event];
    }
    
  3. 将此 SampleButton 添加到第一个选项卡。

  4. 为所有触摸方法添加了断点。
  5. 在设备上运行。
  6. 测试所有触摸方法都按预期触发。
  7. 现在触摸 SampleButton,然后也按下第二个选项卡。

结果:视图切换到第二个选项卡,但在 SampleButton 中从未调用 touchesCancelled 和/或 touchesEnded。如果在我触摸该按钮时视图发生变化,其中一个或另一个不应该触发吗?这被证明是一个巨大的问题,因为在我的应用程序中,当该按钮按下时我正在播放声音,并且如果用户在按下它的同时切换选项卡,它永远不会停止播放。似乎这曾经在 iOS3 和 iOS4 中正常工作。

4

3 回答 3

3
于 2012-11-10T18:17:28.283 回答
1

将按钮子类化似乎很难做到这一点。只需告诉音频播放器停止在 viewDidDisappear:animated: 方法中播放,就像 RA 建议的那样。

于 2012-11-10T17:11:18.663 回答
1

I worked around this by setting targets for the actions instead of using the touch methods:

[self addTarget:self action:@selector(handleKeyPressed) forControlEvents:UIControlEventTouchDown];
[self addTarget:self action:@selector(handleKeyReleased) forControlEvents:UIControlEventTouchUpInside];
[self addTarget:self action:@selector(handleKeyReleased) forControlEvents:UIControlEventTouchCancel];

These seems to get fired correctly even when the view swaps out.

于 2012-11-11T04:11:58.090 回答