1

当我在情节提要中创建 UISwitch 元素并将其附加到 .h 文件时,控制器中生成了以下行:

@property (weak, nonatomic) IBOutlet UISwitch *wantHelp;

而且我试图弄清楚如何在值更改时让系统通知,所以我尝试在原始语句下方手动添加如下内容:

- (IBAction)wantHelp:(id)helpToggle;

在控制器中,我有这样的东西:

-(IBAction)helpToggle:(id)sender
{
    NSLog(@"sender is: %@", sender);

    if (wantHelp.on) 
    {
        NSLog(@"yes");
    }
    else 
    {
        NSLog(@"No");
    }
}

我想要做的是将 helpToggle IBAction 与特定的 UISwitch 元素连接起来,但是当我运行它时,我得到一个错误:unrecognized selector sent to instance据我所知,这意味着我在一个不正确的对象上调用了一个操作。

有人可以帮我理解我在这里做错了什么吗?

谢谢!!

这就是我的 .m 文件的样子:

@interface PlanBusinessController ()

@end

@implementation PlanBusinessController
@synthesize businessDescription;
@synthesize personName;
@synthesize personEmail;
@synthesize privacy;
@synthesize wantHelp;


-(IBAction)helpToggle:(id)sender
{
    NSLog(@"sender is: %@", sender);

    if (wantHelp.on) 
    {
        NSLog(@"yes");
    }
    else 
    {
        NSLog(@"No");
    }
}
4

4 回答 4

3

发生的事情是您的 UISwitch 已被告知要调用,wantHelp:但是因为在您的实现文件(.m 文件)中不存在调用此方法的方法,这就是调用“无法识别的选择器发送到实例”错误的原因。

于 2012-07-13T19:25:23.110 回答
2

好的,所以所有答案都没有给你“简单的方法”

按住您的控件UISwitch并将其拖到您的.h文件中。

然后您将看到一个对话框,允许您选择“连接”

在此处输入图像描述

此连接确定您是在创建 IBOutlet 还是 IBAction。

将其更改为“Action”后,您将自动选择“ValueChanged”作为事件,您可以给它起任何您想要的名称:

在此处输入图像描述

我命名它helpSwitchToggled。然后,您将在 .h 和 .m 文件中拥有您的 IBAction。

在此处输入图像描述

在您的.m文件中,您可以为值更改操作编写代码:

在此处输入图像描述

对于复制粘贴:

- (IBAction)helpSwitchToggled:(id)sender {

    if(self.helpSwitch.on)
    {
        //Do the On stuff
    } else {
        //Do the Off Stuff
    }

}

这是在您的界面上进行与某事相关联的操作的“简单方法”。

IBAction 和 IBOutlet 之间的区别已在其他答案中指出,但基本上 Actions 是对控制事件的响应,而 Outlets 是与视图中元素的连接。

于 2012-07-13T19:51:54.870 回答
2

因此,您可以拥有任意数量的数量,IBAction或者一个没关系。最重要的是在您的 .h 文件中声明它,进入界面构建器并将所需的操作链接到该 .h 文件IBAction。所以你有你的IBAction

-(IBAction)WHATEVERNAME:(id)sender

然后转到界面生成器并单击您的文件所有者对象(有点左上角)。然后单击 Connections Inspector(右上角)并从显示 WHATEVERNAME 的点拖动到您的对象(UISwitch wantHelp),当您这样做时,它会询问您要接收什么操作

请记住,原因(id)sender是您应该投射您的对象

UISwitch * tempSwitch = (UISwitch*) sender;

这样你就有了一个指向 switch 对象的指针,这是因为你可以让这个相同的 IBAction 方法处理许多不同类型的对象


虽然这都是好东西,但实际错误来自多个选择器被调用。一旦我们进入连接检查器,我们就能看到它调用了 2 个不同的方法。一个是有效的 IBAction,另一个是之前声明的方法 wantHelp

于 2012-07-13T19:29:24.450 回答
1

IBAction 只是一个标签,让 Interface Builder 知道它可以附加到该操作。

IBAction 被定义为 void 但名称 Interface Builder 允许您将连接拖到它上面并将对象的事件连接到该函数。

除此之外,您的操作应该具有有意义的名称。helpToggle 在我看来是一个开关。但通常我也会在该消息中包含一些描述。如

- (IBAction) helpSwitchToggled:(id) sender{
}

此消息为您提供了一个非常有意义的名称,阅读它会告诉您确切的名称以及对象发送的消息类型。

同时,我还将为该开关提供一个名为 helpSwitch 的 IBOutlet,就像这个一样。

@property (nonatomic, weak) IBOutlet UISwitch *helpSwitch;

如你看到的。该对象显然是一个开关。而 IBOutlet 实际上被定义为什么都没有。但它又是一个标签,Interface Builder 使用它来知道您有一个可以与 Interface Builder 链接的属性。

IBAction 和 IBOutlet 只不过是元数据,它告诉接口构建器这是一个可能的连接。连接它们取决于您,编译器将它们视若无睹。

我希望这些信息对你有帮助:)

于 2012-07-13T19:35:28.277 回答