4

我通过 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 上设置的文本没有更新。

4

1 回答 1

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等。或者您可以创建一种方法,- (IBAction)buttonTapped:(id)sender并让该方法检查sender以确定哪个按钮被点击。

于 2013-06-15T18:12:24.013 回答