iOS 以编程方式创建的按钮不起作用

Posted

技术标签:

【中文标题】iOS 以编程方式创建的按钮不起作用【英文标题】:iOS Programmatically Created Button not Working 【发布时间】:2012-05-22 15:20:53 【问题描述】:

您好,我有一个UIButton,是我以编程方式创建的,但不幸的是它无法正常工作。当我点击UIButton 时,没有任何反应。我不知道是什么问题。任何帮助将不胜感激。

UIButton *connectedStories = [UIButton buttonWithType:UIButtonTypeRoundedRect];

//set the position of the button
connectedStories.frame = CGRectMake(10, 10, 1900, 30);
connectedStories.backgroundColor = [UIColor whiteColor]; 
[connectedStories setTitle:@"Button" forState:UIControlStateNormal];
[connectedStories setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[connectedStories addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
[label setText:storyTitle];
[label1 setText:storyDescription];
[contentView addSubview:backGroundImageView];
[contentView addSubview:connectedStories];
[contentView addSubview:label];
[contentView addSubview:label1];

[viewContainer addSubview:contentView];
return contentView;

- (void)buttonClicked

  NSLog(@"button clicked");

【问题讨论】:

按钮是否如您所愿? contentView 是什么类型的视图?尝试拨打[contentView setUserEnabled:YES]; 看看是否可行 [contentView userInteractionEnabled] 和 [viewContainer userInteractionEnabled] 提供什么?也许其中一些被禁用,您将不会收到事件。 内容视图只是一个 UIVIEW。显然上述两种方法,即 setUserEnabled 或 userInteractionEnabled 没有在接口中声明:( 实际上 setUserInteractionEnabled:YES 已声明但没有它不起作用:( 标签和 backgroundImageView 是在按钮中还是在按钮上方,或者它们是分开的东西?上面的代码在哪个类中? 【参考方案1】:

我认为标签接收触摸而不是按钮。 添加 userInteractionEnabled = NO;到你的标签。

label.userInteractionEnabled = NO;
label1.userInteractionEnabled = NO;

【讨论】:

做到了,但没有也不起作用:(还为按钮的 userinteractionenabled 设置了 yes。 确保 containerView 和 viewContainer 有 userInteractionEnabled = YES; 是的,我已将用户交互设置为容器视图,但忘记为视图容器执行此操作。设置有效。谢谢【参考方案2】:

尝试将代码的顶部更改为:

CGRect frame = CGRectMake(10, 10, 1900, 30);
UIButton *connectedStories = [[UIButton alloc] initWithFrame:frame];

//set the position of the button
[connectedStories setBackgroundColor:[UIColor whiteColor]]; 
[connectedStories setTitle:@"Button" forState:UIControlStateNormal];
[connectedStories setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[connectedStories addTarget:nil action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];

【讨论】:

并确保添加到视图中的标签与按钮不在同一范围内,否则它们可能会覆盖按钮 我运行了这段代码,它确实有效。如果您需要我们的帮助,请向我们提供更多信息。 Eli,它现在可以工作了。对于我正在使用的两个视图,原因是 UserInteractionEnabled 未设置为 yes。【参考方案3】:

很可能是这样的:

[contentView addSubview:backGroundImageView];
[contentView addSubview:connectedStories];
[contentView addSubview:label];
[contentView addSubview:label1];

我确定您需要按以下顺序添加它们:

[contentView addSubview:backGroundImageView];
[contentView addSubview:label];
[contentView addSubview:label1];
[contentView addSubview:connectedStories];

这是因为当您调用 addSubview: 时,它会将其添加到子视图的接收者列表的末尾,并且最近的子视图出现在顶部。

查看 UIView 文档here

未检测到交互的原因是您没有将 touchEvents 传递给其他子视图,因为它们被 label1 捕获并停在那里。

默认情况下,最后一个 subView 会捕获所有触摸事件并且不会传递它们。

【讨论】:

【参考方案4】:

在选择器的最后一个方法中添加冒号

[connectedStories addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [label setText:storyTitle];

【讨论】:

【参考方案5】:
UIButton *custombutton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[custombutton addTarget:self
                 action:@selector(aMethod:)
       forControlEvents:UIControlEventTouchUpInside];
[custombutton setTitle:@"Click" forState:UIControlStateNormal];
custombutton.frame = CGRectMake(80.0, 110.0, 160.0, 40.0);
custombutton.titleLabel.textColor = [UIColor colorWithRed: 2.0f/255.0f green: 155.0f/255.0f blue: 213.0f/255.0f  alpha:1];
 [custombutton setImage:[UIImage imageNamed:@"hh.png"] forState:UIControlStateNormal];
 [view addSubview:custombutton];

【讨论】:

以上是关于iOS 以编程方式创建的按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

IOS Swift以编程方式创建的navigationController TOOLBAR(底栏)项目操作不起作用

iOS 上的 sendSubviewToBack 不起作用

以编程方式创建 UIView 在 Xcode 11.1 中不起作用

按钮stackView间距不起作用-Swift-以编程方式

以编程方式创建布局,使用堆栈视图和约束不起作用

当 .click() 不起作用时,如何以编程方式单击此页面上的按钮?