UIButton操作在XIB中设置但未触发

时间:2011-07-26 08:29:24

标签: ios uikit interface-builder ibaction

问题描述很简短,但我想我不需要说太多。当我加载自定义电影播放器​​的.xib时,UIButton / UIBarButtonItem控件设置为我的File's Owner对象的ivars / properties,并且它们的操作/选择器也设置为各种本地方法。永远不会输入该函数(未命中gdb断点)。

我已经验证了setView:set...Button:被调用(尚未调查它们是否为零)。我还尝试在UI初始化时手动调用addTarget:action:forControlEvents: / setAction:,但无济于事。

这里也有额外的奇怪之处:按钮实际上突出显示,然后保持突出显示。因此,他们会从UIControlStateNormal转换为UIControlStateHighlighted(/ UIControlStateSelected,具体取决于单个点按滚动的方式),但是在UIControlEventTouchUpInside上会触发按钮的操作,按钮似乎保持在突出显示/选中状态。

请注意,相同.xib中的以下控件无问题:

  • MPVolumeView(Apple-subclassed UISlider
  • UISlider(为UIControlEvent ValueChanged TouchDownTouchUpInsideTouchUpOutsideTouchCancelUIGestureRecognizer设置选择器,所有这些似乎仍然有效)
  • .xib s(即使按钮上的单击按钮当前有效)

这曾经有用,那么layerClass之后发生了什么变化?良好:

  • 现在使用AVPlayerLayer作为顶级视图的UIView(因此顶级视图也是子类.a)。这是为了修复一些电影加载的笨拙/视觉滞后。

这几乎就是所有改变了,至少我能想到的是......我也尝试过删除并重新连接IB中的插座。不一定是解决方案的想法也受到欢迎!

编辑:好的,所以这里概述了它正在工作/中断的设备。模拟器未经过测试,因为我的armv6个库只有armv7 / { {1}}编译的体系结构。

  1. iPhone 3G on 4.2.1(8C148)越狱,使用PwnageTool 4.2,基带版本05.15.04,未插入SIM卡:按钮未触发
  2. 4.3.5(8L1)上的iPad 1,基带版本07.11.01,已插入SIM卡:按钮 触发
  3. iPad 2 on 5.0b4(9A5274d),没有基带(仅限WiFi):按钮没有触发
  4. 4.3.4(8K2)上的iPhone 4,已插入SIM卡:按钮 触发
  5. 我尝试从iOS 4.3(Xcode 4.0.2 4A2002a)和iOS 5.0b4(Xcode 4.2 4C139)部署到设备1和2,两种情况都相同(手机不起作用,打击垫工作)。我也尝试从设备1和2完全卸载应用程序并进行干净的构建,重新安装时的结果相同。设备3我仅部署到Xcode 4.2,而设备4仅部署在Xcode 4.0.2中。

    只有相关性我可以看到没有细胞信号=不起作用,但这是荒谬的。为了防万一,我在设备2上关闭了单元格数据,但它仍然可以在WiFi上正常工作。

3 个答案:

答案 0 :(得分:2)

我有类似的问题。结果是因为我的按钮不在视图中。

我的应用程序处于横向模式,但在某些设备和/或iOS版本上旋转时,UIViewController的视图未自动调整大小。

为了可视化问题,我在初始化视图和按钮时添加了这个:

self.view.backgroundColor = [UIColor colorWithRed:1.0f green:0.0f blue:1.0f alpha:0.4f];

有了这个,我可以看到在某些情况下没有响应按钮的按钮超出了UIViewController的视图(因此没有得到事件)。

要解决此问题,我只是将其添加到初始化视图和按钮的位置:

// Be sure to set the frame for this view controller to be fullscreen
CGSize winSize = [UIScreen mainScreen].bounds.size;

// Note that we switched height and width...this is because
// these values are always for portrait mode
self.view.frame = CGRectMake(0.0f, 0.0f, winSize.height, winSize.width);

请务必特别注意[UIScreen mainScreen] .bounds.size将始终返回纵向值,如果您在横向模式下操作,则必须将其反转。

添加之后,我可以看到我的视图覆盖了整个屏幕,按钮开始响应所有设备和iOS版本上的事件/按下。

如果您使用的是cocos2d,您可以使用它而不必担心手动管理方向:

CGSize winSize = [[CCDirector sharedDirector] winSize];

答案 1 :(得分:1)

让我猜你使用UIGestureRecognizer。

你必须使用UIGestureRecognizerDelegate并告诉识别器在用户点击按钮时不要触发。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UIButton class]]){
        return NO;
    }
    return YES;
}

这解决了我的问题!

答案 2 :(得分:0)

将所有基于selector / action的回调切换为UIGestureRecognizer,而不是解决了这个问题。仍然不确定为什么它不起作用。