【问题标题】:IBOutlet returning nil after IBAction Implementation (IOS)IBOutlet 在 IBAction 实施 (IOS) 后返回 nil
【发布时间】:2013-06-12 03:58:37
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    您不能像这样覆盖 setBtnToday:setBtnToday_less_1:setBtnToday_less_2:,因为这些正是运行时用来设置您在 xib 文件中配置的按钮的 setter 方法。

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

    【讨论】:

    • 哦,上帝没有注意到我使用 setter 方法作为我的操作的名称.. thx.- 重命名操作一切正常
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 2017-05-18
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多