我通过Xcode的Interface Builder创建了3个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上设置的文本没有更新。
答案 0 :(得分:3)
您无法覆盖setBtnToday:
,setBtnToday_less_1:
和setBtnToday_less_2:
,因为这些正是运行时所依赖的设置方法,用于设置您在自己配置的按钮xib文件。
当您创建(非readonly
)属性时,编译器会为您的属性合成“getter”和“setter”方法。默认情况下,getter方法为- (<property type>)<property name>
,setter为- (void)set<CamelCase property name>
。您发布的IBAction方法正是您的三个按钮属性的设置者。通过明确地编写它们(并使它们什么也不做),你阻止编译器合成默认的setter实现,这反过来又阻止了xib加载代码以预期的方式工作。
如果您尝试实施方法来响应被点按的按钮,您应该将其他名称命名为- (IBAction)btnTodayTapped:(id)sender
,- (IBAction)btnToday_less_1_tapped:(id)sender
等。或者您可以将设为< / em>方法,- (IBAction)buttonTapped:(id)sender
并使用该方法检查sender
以确定点击了哪个按钮。