Ios UIButton动作设置在XIB中,但不触发

Ios UIButton动作设置在XIB中,但不触发,ios,uikit,interface-builder,ibaction,Ios,Uikit,Interface Builder,Ibaction,问题描述很简单,但我想我不需要说太多。当我加载自定义电影播放器的.xib时,UIButton/UIBarButtonim控件设置为我的文件所有者对象的IVAR/属性,并且它们的操作/选择器也设置为各种本地方法。从未输入函数(未命中gdb断点) 我已经验证了正在调用setView:和set…按钮:(尚未调查它们是否为零)。我还尝试在UI初始化时手动调用addTarget:action:forControlEvents:/setAction:,但没有成功 这里还有额外的奇怪之处:按钮实际上高亮显示,

问题描述很简单,但我想我不需要说太多。当我加载自定义电影播放器的
.xib
时,UIButton/UIBarButtonim控件设置为我的
文件所有者对象的IVAR/属性,并且它们的操作/选择器也设置为各种本地方法。从未输入函数(未命中gdb断点)

我已经验证了正在调用
setView:
set…按钮:
(尚未调查它们是否为零)。我还尝试在UI初始化时手动调用
addTarget:action:forControlEvents:
/
setAction:
,但没有成功

这里还有额外的奇怪之处:按钮实际上高亮显示,然后保持高亮显示。因此,它们从
UIControlStateNormal
过渡到
UIControlStateHighlighted
(/
UIControlStateSelected
,取决于单个点击滚动的方式),但在触发按钮动作的
UIControlEventTouchUpInside
上,按钮似乎保持在突出显示/选择的状态

请注意,相同
.xib
中的以下控件工作正常:

  • MPVolumeView
    (苹果子类
    UISlider
  • UISlider
    (为
    UIControlEvent
    s
    ValueChanged
    触地
    触地
    触地
    触地
    触地
    ,所有这些似乎都在工作)
  • UIgestureRecognitor
    s(即使是按钮上的单点式识别器当前也可以工作)
这过去是有效的,那么从那时起,
.xib
中发生了什么变化?嗯:

  • 现在,使用AVPlayerLayer作为顶级视图的
    layerClass
    (因此顶级视图也是一个子类
    UIView
    )。这是为了修复一些电影加载错误/视觉延迟
这就是事实上所有的改变,至少我能想到。。我也尝试过移除并重新连接IB中的插座。也欢迎不一定是解决方案的想法

编辑:好的,下面是它正在工作/中断的设备的概述。模拟器未测试,因为我有
.a
库,其中只编译了
armv6
/
armv7
体系结构

  • 4.2.1(8C148)上的iPhone 3G使用PwnageTool 4.2越狱,基带版本
    05.15.04
    ,未插入SIM卡:按钮未启动
  • 4.3.5(8L1)上的iPad 1,基带版本
    07.11.01
    ,插入SIM卡:按钮启动
  • 5.0b4(9A5274d)上的iPad2,无基带(仅限WiFi):按钮不启动
  • 4.3.4(8K2)上的iPhone 4,SIM卡插入:按钮启动
  • 我尝试从iOS 4.3(Xcode 4.0.2 4A2002a)和iOS 5.0b4(Xcode 4.2 4C139)部署到设备1和设备2,两种情况下的结果相同(手机不工作,pad工作)。我还尝试从设备1和设备2完全卸载该应用程序,并进行干净的构建,在重新安装时得到相同的结果。设备3仅从Xcode 4.2部署到,设备4仅从Xcode 4.0.2部署到


    我能看到的唯一相关性是没有细胞信号=不工作,但那是荒谬的。为了以防万一,我关闭了设备2上的手机数据,但它在WiFi上仍然可以正常工作。

    让我猜你使用的是UIgestureRecognitor

    您必须使用UIgestureRecognitzerDelegate并告诉识别器,如果用户点击按钮,不要启动识别器

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

    这为我解决了问题

    将基于所有
    选择器
    /
    操作
    的回调切换到
    UIGestureRecognizer
    解决了这个问题。但仍然不确定为什么它不起作用。

    我也有类似的问题。原来是因为我的按钮不在视图中

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

    为了可视化问题,我在初始化视图和按钮时添加了以下内容:

    self.view.backgroundColor = [UIColor colorWithRed:1.0f green:0.0f blue:1.0f alpha:0.4f];
    
    // 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);
    
    启用此选项后,我可以看到在某些情况下没有响应按下的按钮不在UIViewController的视图中(因此无法获取事件)

    为了解决这个问题,我刚刚在初始化视图和按钮时添加了以下内容:

    self.view.backgroundColor = [UIColor colorWithRed:1.0f green:0.0f blue:1.0f alpha:0.4f];
    
    // 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];
    

    也许这是一个愚蠢的答案,但你是否尝试过清理你的项目?清理构建会给出同样的结果。很好的建议tho,这是一个潜在的解决方案。我有同样的问题,如果你找到解决方案,请在你自己的线程上回答。我也要这么做。不幸的是,Andreas,我没有使用
    UIGestureRecognizer
    点击“完成”按钮和其他单键按钮。所有这些都只是IB中内置的
    选择器
    操作
    插座。我确实使用手势识别器,但它们用于回放和快进按钮,以及双击缩放。他们现在正在工作。我将尝试添加一些SingleTapGestureRecognitors,看看这是否能让UI正常工作。