1

问题:

我无法让我的 UIButton 向我的班级发送事件调用

这是我首先尝试的:

我做了一个扩展 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 和视图
  • 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 文件的屏幕截图

如您所见,我有四个按钮,但唯一连接到任何东西的是单人按钮我也有 UIView 连接到视图。

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

将操作连接到按钮的屏幕截图

buttonPressed是我想要在按下按钮时调用的方法,所以我按住 ctrl 键单击 First Responder,然后单击旁边的圆圈buttonPressed,然后将其拖到 Single-Player 按钮的顶部。然后弹出下一个对话框窗口,我点击了 Touch up Inside。以下是 Received Actions 窗口的外观:

第一响应者窗口的屏幕截图

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

就这样不存在我是否有能力的问题,这是我实际单击按钮的照片:

截屏

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

方法截图

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

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

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

可笑的方法名称的屏幕截图

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

截屏

(在这里插入沮丧)

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

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

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

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

我用show上面的方法替换了我的方法。唯一不同的是最后一行。我断开了我的方法与 NIB 中的 Single-Player 按钮的连接。然后我运行它,我兴奋了一秒钟,因为我得到了一些输出。这是我得到的:

(lldb) 

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

有人看到我在这里做错了吗?只是 Xcode 很脆弱吗?

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


更新:

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

#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 中。singlePlayerButton和旁边的圆圈view仍然填充,但方法旁边的气泡没有。我再次运行代码并得到相同的输出。

4

1 回答 1

1

所以我会把它放在评论中,因为它实际上只是一个建议,但是我没有代表很抱歉让你寄予厚望,但我相信触摸事件的范围仅在它发生的 UIView 内。当触发触摸事件时,它不会传递给 UIView 的处理程序(MainScreen 类),因此不会调用事件的侦听器方法......但是您可以在界面构建器中将其链接到按钮是对我来说莫名其妙,所以我可能会离开。

无论如何,我认为你下一步应该做的是让你的 MainScreen 成为 UIView 对象,看看它对视图中按钮的事件处理有什么作用。

于 2012-12-31T02:21:05.117 回答