问题:
我无法让我的 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
这是它的样子:
如您所见,我有四个按钮,但唯一连接到任何东西的是单人按钮我也有 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
仍然填充,但方法旁边的气泡没有。我再次运行代码并得到相同的输出。