问题:
我无法让我的 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
这是它的样子:
如您所见,我有四个按钮,但唯一连接到任何东西的是单人游戏按钮,我还连接了 UIView 以查看。
现在,我将 Action 链接到单人游戏按钮,如下所示:
buttonPressed
是我希望在按下按钮时调用的方法,因此我按住 Ctrl 键并单击 First Responder,然后单击 buttonPressed
旁边的圆圈然后将其拖到单人游戏按钮的顶部。然后弹出下一个对话窗口,我点击了 Touch up Inside。 Received Actions 窗口如下所示:
现在,我认为此时它应该可以工作了。我在我的 iPhone 模拟器上运行它并按下按钮。
为了不存在我能不能胜任的问题,这是我实际点击按钮的照片:
我没有得到任何输出。然后我转到我的代码并查看该方法。这是它的样子:
如您所见,椭圆形未填充,这意味着该方法未配对。所以我很自然地认为它被另一种方法覆盖了。所以这是该方法现在的样子:
- (IBAction)aVerySpecificMethodNameForMyButtonListener:(id)sender
{
NSLog(@"A button was pressed!");
}
然后我回到我的 NIB 窗口,取消配对我的单人游戏按钮,然后将它修复为 aVerySpecificMethodNameForMyButtonListener
。现在这是它的样子:
然后我再次运行它,当我按下按钮时仍然没有任何反应。然后我回到代码:
(在这里插入沮丧)
此时我重新启动了 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 中。 singlePlayerButton
和 view
旁边的圆圈仍然被填充,但方法旁边的气泡没有。我再次运行代码并获得相同的输出。
最佳答案
所以我会把它放在评论中,因为它真的只是一个建议,但是我还没有代表,很抱歉让你抱有希望,但我相信触摸事件的范围只在它发生的 UIView 内.当触发事件时,它不会传递给 UIView 的处理程序(MainScreen 类),因此不会调用事件的监听器方法......但是您可以在界面构建器中将其链接到按钮令我感到困惑,所以我可能离题了。
无论如何,我认为您下一步应该做的是让您的 MainScreen 成为一个 UIView 对象,然后看看它对 View 中按钮的事件处理有何作用。
关于objective-c - 无法从 UIButton 获取 UITouch 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096379/