iAction实施(IOS)后返回零的IBOutlet

iAction实施(IOS)后返回零的IBOutlet,ios,objective-c,Ios,Objective C,我通过Xcode的接口生成器创建了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

我通过Xcode的接口生成器创建了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;
-(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 */ }
在我的控制器中,我有:

@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];
}
上面的代码可以正常工作,但是如果我实现了iAction,它就不能正常工作

实现如下所示:

@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;
-(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文件中删除iAction的代码,它将重新开始工作

我做错了什么


注意:不工作意味着它编译没有错误并运行,但我尝试在UIButton上设置的文本没有更新。

您不能覆盖
setbtnoday:
setbtnoday\u less\u 1:
,和
setbtnoday\u less\u 2:
类似,因为这些正是运行时用来设置在xib文件中配置的按钮的setter方法

当您创建(非
只读
)属性时,编译器会为您的属性合成“getter”和“setter”方法。默认情况下,getter方法是
-()
,setter是
-(void)set
。您发布的那些iAction方法正是三个按钮属性的设置器。通过显式地编写它们(并使它们什么都不做),您将阻止编译器合成默认setter实现,而这反过来又会阻止xib加载代码以预期的方式工作


如果您试图实现响应正在点击的按钮的方法,您应该给它们命名其他名称,例如
-(iAction)btnTodayTapped:(id)sender
-(iAction)btnToday\u less\u 1\u tapped:(id)sender
,等等。或者,您可以创建一个方法,
-(iAction)buttonatpped:(id)发送者
,并让该方法检查发送者,以确定点击了哪个按钮。

哦,上帝没有注意到我的行为是用setter方法命名的。。thx。-重命名动作一切正常