objective-c - 无法从 UIButton 获取 UITouch 事件

标签 objective-c ios xcode cocoa-touch user-interface

问题:

我无法让我的 UIButton 向我的类(class)发送事件调用

这是我首先尝试的:

我做了一个扩展 UIViewController 的类,叫做 Viewer

#import "Viewer.h"
#import "MainScreen.h"

@implementation Viewer

- (void)viewDidLoad
{
    MainScreen* main = [[MainScreen alloc]init: self];
    [main show];

    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

然后:

  • 我创建了一个名为 MainScreen 的类、2 个 IBOutlets - singlePlayerButton 和 View
  • Viewer 是 UIViewController 的一个实例
  • buttonPressed 的返回类型为 IBAction

主屏幕:

#import "MainScreen.h"
#import "Viewer.h"

@implementation MainScreen
{
    IBOutlet UIButton* singlePlayerButton;
    IBOutlet UIView* view;

    Viewer* viewer;
}

- (id)init:(Viewer*) theViewer
{
    self = [super init];
    viewer = theViewer;
    return self;
}

- (void)show
{
    [[NSBundle mainBundle] loadNibNamed:@"MainScreenLayout" owner:self options:nil];
    [viewer.view addSubview:view];
}

- (IBAction)buttonPressed:(id)sender
{
    NSLog(@"A button was pressed!");
}

@end

然后我创建了一个名为 MainScreenLayout.xib

的 NIB

这是它的样子:

Screenshot of my NIB file

如您所见,我有四个按钮,但唯一连接到任何东西的是单人游戏按钮,我还连接了 UIView 以查看。

现在,我将 Action 链接到单人游戏按钮,如下所示:

Screenshot of connecting the action to the button

buttonPressed 是我希望在按下按钮时调用的方法,因此我按住 Ctrl 键并单击 First Responder,然后单击 buttonPressed 旁边的圆圈然后将其拖到单人游戏按钮的顶部。然后弹出下一个对话窗口,我点击了 Touch up Inside。 Received Actions 窗口如下所示:

Screenshot of First Responder Window

现在,我认为此时它应该可以工作了。我在我的 iPhone 模拟器上运行它并按下按钮。

为了不存在我能不能胜任的问题,这是我实际点击按钮的照片:

Screenshot

我没有得到任何输出。然后我转到我的代码并查看该方法。这是它的样子:

Screenshot of method

如您所见,椭圆形未填充,这意味着该方法未配对。所以我很自然地认为它被另一种方法覆盖了。所以这是该方法现在的样子:

- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender
{
    NSLog(@"A button was pressed!");
}

然后我回到我的 NIB 窗口,取消配对我的单人游戏按钮,然后将它修复为 aVerySpecificMethodNameForMyButtonListener。现在这是它的样子:

Screenshot for rediculous method name

然后我再次运行它,当我按下按钮时仍然没有任何反应。然后我回到代码:

Screen shot

(在这里插入沮丧)

此时我重新启动了 Xcode 和 Simulator 并再次查看了所有内容,但它仍然无法正常工作。

这是我接下来尝试的,看起来简单了十亿倍:

- (void)show
{
    [[NSBundle mainBundle] loadNibNamed:@"MainScreenLayout" owner:self options:nil];
    [viewer.view addSubview:view];

    [singlePlayerButton addTarget:self action:@selector(aVerySpecificMethodNameForMyButtonListener:) forControlEvents:UIControlEventTouchUpInside];
}

我将 show 方法替换为上面的方法。唯一不同的是最后一行。我从 NIB 中的单人游戏按钮断开了我的方法。然后我运行它,我兴奋了一秒钟,因为我得到了一些输出。这是我得到的:

(lldb) 

非常有用的输出 C 调试器,一如既往。在接下来的几个小时里,我在 SO 上花了很多时间,试图找出我做错了什么。我尝试了无数示例,但没有一个有效。

有人看到我在这里做错了什么吗?只是 Xcode 变得不稳定了吗?

感谢阅读!!欢迎所有相关答案!


更新:

我还尝试将 UIButton 的声明更改为头文件中的属性:

#import <Foundation/Foundation.h>
#import "Viewer.h"

@interface MainScreen : NSObject
{
    IBOutlet UIView* view;

    Viewer* viewer;
}

@property (weak, nonatomic) IBOutlet UIButton* singlePlayerButton;

- (id)init:(Viewer*) theViewer;
- (void)show;
- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender;

@end

因此,这是我在 MainScreen.m 中所做的更改以符合要求:

#import "MainScreen.h"
#import "Viewer.h"

@implementation MainScreen

- (id)init:(Viewer*) theViewer
{
    self = [super init];
    viewer = theViewer;
    return self;
}

@synthesize singlePlayerButton;

- (void)show
{
    [[NSBundle mainBundle] loadNibNamed:@"MainScreenLayout" owner:self options:nil];
    [viewer.view addSubview:view];

    [singlePlayerButton addTarget:self action:@selector(aVerySpecificMethodNameForMyButtonListener:) forControlEvents:UIControlEventTouchUpInside];
}

- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender
{
    NSLog(@"A button was pressed!");
}

@end

现在 MainScreen.m 文件中没有变量声明,我将它们全部移到了 Header 中。 singlePlayerButtonview 旁边的圆圈仍然被填充,但方法旁边的气泡没有。我再次运行代码并获得相同的输出。

最佳答案

所以我会把它放在评论中,因为它真的只是一个建议,但是我还没有代表,很抱歉让你抱有希望,但我相信触摸事件的范围只在它发生的 UIView 内.当触发事件时,它不会传递给 UIView 的处理程序(MainScreen 类),因此不会调用事件的监听器方法......但是您可以在界面构建器中将其链接到按钮令我感到困惑,所以我可能离题了。

无论如何,我认为您下一步应该做的是让您的 MainScreen 成为一个 UIView 对象,然后看看它对 View 中按钮的事件处理有何作用。

关于objective-c - 无法从 UIButton 获取 UITouch 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096379/

相关文章:

ios - 在 iOS 7 - 7.1.x 上截图

objective-c - 核心数据无效规则不起作用?

ios - UIImageView 上的阴影问题

ios - Storyboard:如何在更改布局约束时让 Xcode 自动更新框架?

ios - 从 Container View 推送 ViewController 会将其 View 框架更改为原始大小

ios - 颜色作为 slider 位置的函数,用于设置颜色

objective-c - 查看生成数字组合的代码

ios - 如何禁用/启用 View Controller 中的所有文本字段

objective-c - Xcode 是否有类似 Javadoc 的插件可以自动生成文档模板?

ios - 类不可用。 Unwind segues 在 6.0 之前的 iOS 版本上不可用