IBOutlet在IBAction实施(IOS)后返回零

时间:2013-06-15 18:10:12

标签: ios objective-c

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

1 个答案:

答案 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以确定点击了哪个按钮。