在iOS中,实现IBAction后,IBOutlet返回nil。

4

我有3个通过Xcode的Interface Builder创建的UIButton。

在Controller.h中定义了IBOutlet和IBAction,如下所示:

@property (strong, nonatomic) IBOutlet UIButton *btnToday;
@property (strong, nonatomic) IBOutlet UIButton *btnToday_less_1;
@property (strong, nonatomic) IBOutlet UIButton *btnToday_less_2;


- (IBAction) setBtnToday: (UIButton *) sender;

- (IBAction) setBtnToday_less_1: (UIButton *) sender;
- (IBAction) setBtnToday_less_2: (UIButton *) sender;

在我的 Controller.m 文件中有这个代码:
@synthesize btnToday;
@synthesize btnToday_less_1;
@synthesize btnToday_less_2;


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [btnToday setTitle:@"Today" forState: UIControlStateNormal];
    [btnToday_less_1 setTitle:@"Yesterday" forState: UIControlStateNormal];
    [btnToday_less_2 setTitle:@"Day before yesterday" forState: UIControlStateNormal];
}

上面的代码可以正常运行,但是如果我实现了IBAction就不能运行。
实现如下:
-(IBAction)setBtnToday:(UIButton *)sender{ /* a method call */ }
-(IBAction)setBtnToday_less_1:(UIButton *)sender{  /* a method call */ }
-(IBAction)setBtnToday_less_2:(UIButton *)sender{ /* a method call */ }

如果我对任何IBOutlet进行NSLog,它们都会返回nil。如果从Controller.m文件中删除IBAction的代码,则它会重新开始工作。
我做错了什么?
注意:不起作用意味着它编译没有错误并且运行,但我试图在UIButton上设置的文本没有更新。
1个回答

3
您不能像那样覆盖setBtnToday:setBtnToday_less_1:setBtnToday_less_2:,因为这些正是运行时所依赖的设置您在xib文件中配置的按钮的setter方法。
当您创建一个(非只读)属性时,编译器会自动生成该属性的“getter”和“setter”方法。默认情况下,getter方法是- (<property type>)<property name>,而setter方法是- (void)set<CamelCase property name>。那些你发布的IBAction方法恰好是你三个按钮属性的setter。通过显式地编写它们(并使它们不做任何事情),您阻止了编译器合成默认setter实现,这反过来又阻止了xib加载代码按预期工作。
如果您想要实现响应按钮被点击的方法,您应该将它们命名为其他名称,例如- (IBAction)btnTodayTapped:(id)sender- (IBAction)btnToday_less_1_tapped:(id)sender等。或者,您可以制作一个方法, - (IBAction)buttonTapped:(id)sender,并让该方法检查sender以确定哪个按钮被点击了。

1
哦,天啊,我没有注意到我把设置器方法当作我的操作名称了...谢谢。更改操作名称后一切正常。 - pinedax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接