iPhone UIButton addTarget:action:forControlEvents: 不工作

Posted

技术标签:

【中文标题】iPhone UIButton addTarget:action:forControlEvents: 不工作【英文标题】:iPhone UIButton addTarget:action:forControlEvents: not working 【发布时间】:2010-03-13 02:38:28 【问题描述】:

我看到这里发布了类似的问题,但没有一个解决方案适合我。如下:

我在 UIView 框架内有一个 UIButton 实例,该实例位于另一个 UIView 框架内,该框架位于主窗口 UIView 中。也就是说:

UIWindow 
--> UIView (searchView)
  --> UISearchBar (findField)
  --> UIView (prevButtonView)
    --> UIButton (prevButton)
  --> UIView (nextButtonView)
    --> UIButton (nextButton)

到目前为止,一切都很好:一切都按照我的意愿布置。但是,这些按钮不接受任何类型的用户输入。我正在使用 UIButton 方法 addTarget:action:forControlEvents: 为了让您了解我在做什么,这是我的 nextButton 代码:

nextButton = [UIButton buttonWithType:UIButtonTypeCustom];
[nextButton setImage:[UIImage imageNamed:@"find_next_on.png"] forState:UIControlStateNormal];
[nextButton setImage:[UIImage imageNamed:@"find_next_off.png"] forState:UIControlStateDisabled];
[nextButton setImage:[UIImage imageNamed:@"find_next_off.png"] forState:UIControlStateHighlighted];
[nextButton addTarget:self action:@selector(nextResult:) forControlEvents:UIControlEventTouchUpInside];

nextResult: 方法永远不会被调用,按钮的状态不会在触摸时改变,而且我没有做任何该死的事情来让它工作。我认为所有这些视图层都存在问题:也许我的按钮顶部有东西,但我不确定它可能是什么。

为了信息过载,我找到了一些代码,可以打印出我所有的视图信息。这就是我的整个视图层次结构:

UIWindow
0, 0, 320, 480
UILayoutContainerView
0, 0, 320, 480
    UINavigationTransitionView
    0, 0, 320, 480
        UIViewControllerWrapperView
        0, 64, 320, 416
            UIView
            0, 0, 320, 416
                UIWebView
                0, 44, 320, 416
                    UIScroller
                    0, 0, 320, 416
                        UIImageView
                        0, 0, 54, 54
                        UIImageView
                        0, 0, 54, 54
                        UIImageView
                        0, 0, 54, 54
                        UIImageView
                        0, 0, 54, 54
                        UIImageView
                        -14.5, 14.5, 30, 1
                        UIImageView
                        -14.5, 14.5, 30, 1
                        UIImageView
                        0, 0, 1, 30
                        UIImageView
                        0, 0, 1, 30
                        UIImageView
                        0, 430, 320, 30
                        UIImageView
                        0, 0, 320, 30
                        UIWebDocumentView
                        0, 0, 320, 21291
                UIView
                0, 0, 320, 44
                    UISearchBar
                    10, 8, 240, 30
                        UISearchBarBackground
                        0, 0, 240, 30
                        UISearchBarTextField
                        5, -2, 230, 31
                            UITextFieldBorderView
                            0, 0, 230, 31
                            UIPushButton
                            205, 6, 19, 19
                            UIImageView
                            10, 8, 15, 15
                            UILabel
                            30, 7, 163, 18
                    UIView
                    290, 15, 23, 23
                        UIButton
                        0, 0, 0, 0
                            UIImageView
                            -12, -12, 23, 23
                    UIView
                    260, 15, 23, 23
                        UIButton
                        0, 0, 0, 0
                            UIImageView
                            -12, -12, 23, 23
    UINavigationBar
    0, 20, 320, 44
        UINavigationButton
        267, 7, 48, 30
            UIImageView
            0, 0, 48, 30
            UIButtonLabel
            11, 7, 26, 15
        UINavigationItemView
        79, 8, 180, 27
        UINavigationItemButtonView
        5, 7, 66, 30
MBProgressHUD
0, 0, 320, 480
    UIActivityIndicatorView
    141, 206, 37, 37
    UILabel
    117, 247, 86, 27

相关部分在 UINavigationBar 部分上方注明。

有人有什么建议吗?我都出来了。

感谢阅读。

亚伦。

【问题讨论】:

【参考方案1】:

我想通了,所以为了后代的缘故,这是交易。

最初,我通过将按钮嵌套到 UIView 中并设置它们的框架属性来定位按钮。我能够通过利用 UIButton 对 UIView 的父辈来做同样的事情来简化这一点。所以我拿走了嵌套视图并声明了 UIButton 的位置,如下所示:

nextButton.frame = CGRectMake(searchView.frame.size.width - 30, 15, 23, 23);

但这并没有解决我的问题;它只是让我的代码更精简。原来是我的框架 X 属性的计算导致了这个问题。当我这样重构时:

NSInteger nextX = searchView.frame.size.width - 30;
nextButton.frame = CGRectMake(nextX, 15, 23, 23); 

一切都重新开始了。去图吧。

干杯! 亚伦。

【讨论】:

以上是关于iPhone UIButton addTarget:action:forControlEvents: 不工作的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 类参考文档上的 addTarget 方法

UIButton 的 Swift addTarget 在 UIView 中不起作用

UIbutton frame 和 addtarget 不同

具有自定义视图的 UIButton - addTarget:action:forControlEvents: 不起作用

UIButton.addTarget 无法正常工作。似乎是一个时间问题?

Swift4 - UIButton 在 UIView 中使用 addTarget 时出错