我的子视图中的 UIButton 不起作用

Posted

技术标签:

【中文标题】我的子视图中的 UIButton 不起作用【英文标题】:A UIButton in my subview won't work 【发布时间】:2014-03-12 01:17:43 【问题描述】:

我正在创建一个名为 InfoAboutBlockView 的自定义 UIView,我将它添加到我的 ViewController 中并且它添加正确,但是当我在该自定义 UIView 中按下按钮时它不会触发。

我正在创建一个 xib 文件,在其中设计 UIView,然后创建 .h 和 .m 文件

InfoAboutBlockView.h:

#import <UIKit/UIKit.h>

@interface InfoAboutBlockView : UIView

- (instancetype)init2;

@property (strong, nonatomic) IBOutlet UIView *contentView;

@end

contentView 是链接到 .h 文件的 UIView。

InfoAboutBlockView.m

#import "InfoAboutBlockView.h"

@implementation InfoAboutBlockView


- (instancetype)init2 
    self = [super init];
    if (self) 
        [self loadViewsFromBundle];
    
    return self;

- (void)loadViewsFromBundle 
    NSString *class_name = NSStringFromClass([self class]);
    [[NSBundle mainBundle] loadNibNamed:class_name owner:self options:nil];
    [self addSubview:self.contentView];

- (IBAction)startBlockButtonPressed:(id)sender 
    //This Won't Fire


@end

startBlockButtonPressed 是连接到 .m 文件的按钮。 我在startBlockButtonPressed 设置了一个断点,但它永远不会触发。

这就是我将自定义子视图添加到我的 ViewController 的方式:

InfoAboutBlockView *infoAboutBlockView = [[InfoAboutBlockView alloc]init2];
[self.view addSubview:infoAboutBlockView];

我尝试使用[self.view bringSubviewToFront:infoAboutBlockView]; 将其置于最前面,并检查它不是nil,并且按钮不是nil,但它不会触发。

【问题讨论】:

你有什么证据证明按钮的目标是self(视图控制器)并且它的动作是startBlockButtonPressed: @matt 按钮目标 ist self, I'm setting the xib File's Owner` 到我的InfoAboutBlockView 类,然后拖动以创建一个触摸事件。 好吧,我和你在一起…… @matt 还有什么我忘了做的吗? startBlockButtonPressed 不应该着火吗? 【参考方案1】:

这与我在这里给出的答案基本相同:https://***.com/a/22188740/341994

问题是您的 InfoAboutBlockView 没有大小。 (你从来没有给它一个框架,所以它的框架是零。)因此它是不可触摸的。因此,它的所有子视图都不可触摸。该按钮是可见的,InfoAboutBlockView 的contentView 可能是可见的,但它们超出了InfoAboutBlockView 的范围,即单个点的大小。并且不能触及超出其父视图范围的子视图。

如果你给 InfoAboutBlockView 一个奇怪的背景颜色,这会更明显。加载时您不会看到该颜色。

InfoAboutBlockView *infoAboutBlockView = [[InfoAboutBlockView alloc]init2];
[self.view addSubview:infoAboutBlockView];
infoAboutBlockView.backgroundColor = [UIColor redColor]; // you won't see the red

另一种查看方法是将 InfoAboutBlockView 的 clipsToBounds 设置为 YES;在这种情况下,您将看不到该按钮。

InfoAboutBlockView *infoAboutBlockView = [[InfoAboutBlockView alloc]init2];
[self.view addSubview:infoAboutBlockView];
infoAboutBlockView.clipsToBounds = YES; // you won't see the button!

基本上这就是麻烦的全部原因;当clipsToBounds 为NO 时,视图边界之外的子视图是可见的(这就是clipsToBounds 的意义所在),这使您被愚弄了。可见,但(由于 ios 上的触摸工作方式)不可触摸。

【讨论】:

如果它在我的ViewController 中正确显示,它怎么能没有大小(框架为零)?据我了解,如果框架为零,它就不会出现。 它的子视图是可见的,但视图本身没有大小。您正在通过说init 创建一个 UIView,这会产生一个零大小的视图。你必须说initWithFrame 并给它一个大小。 有没有办法initWithFrame 使用我在 IB 中提供的大小?还是我总是必须在代码中提供尺寸? 您没有在 IB 中提供尺码。它不是来自 IB。 contentView 来自笔尖 (IB)。但是 InfoAboutBlockView 来自 allocinit initWithFrame: 是 UIView 的指定初始化器。如果您在代码中创建自定义 UIView,您必须 调用它。或者分配一个frame。但是,如果您什么都不做(如这里),您将有一个位于零、零且尺寸为零、零的视图。

以上是关于我的子视图中的 UIButton 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果 UIWINdow 的子视图,UIButton 单击不起作用

UIButton 作为 MKAnnotationView 的子视图不起作用

将 UIButton 添加到子视图不起作用

当 UIView 的子视图不起作用时,在 UI Button 上点击方法

如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用

UIImageView 中的 Swift 4 UIButton 操作不起作用