2

我有一个 IBAction,例如:

- (IBAction)showPicker:(id)sender;

如何从 sender 变量中获取控件的名称?

我通常是 ac# 编码器,所以尝试了以下方法无济于事

senderName = ((UIButton *)sender).name;

我需要比控件 ID 更具描述性的东西(也不是按钮标题)。我有 5 个按钮都调用相同的方法。我需要确定单击了哪个以便对适当的控件执行方法操作。IE 我有一个地址选择器方法,但想用 5 个按钮中的每一个填充 5 个具有不同详细信息的文本字段。只是试图保持代码整洁

NB 最初我计划使用 Interface Builders 名称字段,但我被告知(如下)这在运行时不可用。

4

6 回答 6

5

您可能想查看使用tag属性。它是一个整数而不是名称,但可用于区分两个控件。它是从 UIView 继承的,因此任何发送事件的控件都应该拥有它。

它可以在 Interface Builder 中的 View attributes 下进行编辑。

它是一个属性,因此可以使用点符号以编程方式访问它:

control.tag

或者您可以转换为字符串,如下所示:

[stringWithFormat:@"%d", control.tag]
于 2008-12-11T13:42:26.657 回答
3

您不使用 Interface Builder 中的对象名称来引用该对象;它只是供参考。(Interface Builder 还将使用它来提示连接到控件的出口以及控件发送的操作可能被命名,但仅作为提示。)

相反,您将插座添加到您连接到该对象的控制器对象。这使您可以在运行时直接从控制器访问对象,而无需经过任何查找步骤。

此外,听起来您有五个按钮,有五件事要做,都连接到同一个操作方法。不要那样做。

在 Cocoa 和 Cocoa Touch 中,您通常不应该为“每个事件”创建一个操作方法,然后根据哪个控件发送事件来决定要做什么。Cocoa 中的控件自己处理事件,并将它们转换为更高级别的操作。因此,您可以在控制器中实现五种操作方法,将每个按钮连接到相应的操作方法,而不必根据哪个控件发送操作来决定要做什么。

显然,这并不适用于所有情况。例如,如果您有一个按钮矩阵,其中的图像在运行时会发生变化,您可能希望它们都连接到相同的操作并根据它们的标记属性来区分它们。一个好的经验法则是在处理“不同”事物时使用不同的操作方法,而在处理“许多相同”事物时使用相同的操作方法和控制标签。

于 2008-12-11T20:10:04.987 回答
3

虽然我同意标签在许多情况下都可以使用,但是当您有一个包含 100 个按钮的矩阵时,使用整数标签会很痛苦,这些按钮可以在您想要识别的位置进行推送:(1) 推送的内容和 (2) 推送的值. 我发现自己开始发明带有失控的标签号的行/列命名方案。

我希望多个控件共享同一个处理程序,并且我想在 IB 中仔细设计我的 UI,以根据推送的内容将名称/值对传递给键值存储。

作为标签的替代方案,我为 UISegmentedControl 提出了另一种解决方法(它也适用于其他控件)。

(1)新建类和子类UISegmentedControl。将字符串属性 MyCustomKey 添加到您的新类。

@interface CustomSegmentedControl : UISegmentedControl
@property (nonatomic, retain) NSString* myCustomKey; 
@end

(2) 回到 IB,将 UISegmentedContol 实例修改为 CustomSegmentedControl 实例。使用 IB“用户定义的运行时属性”来设置使用 IB 的 myCustomKey 的值。KeyValueCoding 将为您处理属性设置:

通过界面构建​​设置自定义属性的屏幕截图

(3) 将所有按钮连接到一个 IBAction。

(4) 在您的 IBAction 中,您现在可以通过读回您的自定义属性来提取键值对:

- (IBAction)myButtonPressed:(id) sender
{
    if ([sender isKindOfClass:[CustomSegmentedControl class]] == false)
        return;

    // get the key-values from the control
    CustomSegmentedControl *control = (CustomSegmentedControl *)sender;
    NSString *key = [control valueForKey:@"myCustomKey"];
    NSNumber *value = [NSNumber numberWithInteger:[control selectedSegmentIndex]];
    NSLog(@"Pressed control %@ with a value of %@", key, value);
}

在这种情况下,我只对分段控件的整数值感兴趣,但您可以从控件中获取任何属性作为值。

希望这可以帮助。

于 2012-02-20T21:03:44.170 回答
2

Interface Builder Identity 下的name字段是 Interface Builder 独有的;我实际上不确定它是如何使用的,但它不会映射到您实际控件上的可用属性、ivar 或方法。相反,tag如果您不保留对它们的引用作为 ivar,请使用该属性(在 View 属性下)将不同的控件与操作方法区分开来。如果我误解了您并且您想要按钮的标题,请currentTitle改用。

于 2008-12-11T13:36:37.853 回答
0

如果控件具有名称属性,则:

NSString *senderName = [sender name];

这不是大多数控件所具备的。你可能想要:

NSString *senderName = [sender title];

例如,如果它是一个 NSButton。或者正如 Marc 所说,对于 UIButton,使用 currentTitle。

于 2008-12-11T13:41:06.393 回答
0

尝试:

senderTitle = [sender currentTitle];
于 2008-12-11T13:42:09.310 回答