【问题标题】:Get text of button from IBAction - iPhone从 IBAction 获取按钮的文本 - iPhone
【发布时间】:2009-05-20 15:35:08
【问题描述】:

当调用 IBAction 时:

-(IBAction) onClick1: (id) sender;

发送者中传递了什么?由于它是通过 IB 连接的,我不太确定。我的问题是如何让按钮的文本成为传递的对象(最有可能是 NSString),以便我可以在动作实现中调用它。

-(IBAction) onClick1: (id) sender {
  NSLog(@"User clicked %@", sender);
  // Do something here with the variable 'sender'
}

【问题讨论】:

    标签: iphone objective-c cocoa interface-builder


    【解决方案1】:

    sender 应该是启动操作的控件。但是,您不应假定它的类型,而应将其定义为id。相反,在实际方法中检查对象的类,如下所示:

    - (IBAction)onClick1:(id)sender {
        // Make sure it's a UIButton
        if (![sender isKindOfClass:[UIButton class]])
            return;
    
        NSString *title = [(UIButton *)sender currentTitle];
    }
    

    【讨论】:

    • 您不需要将 sender 强制转换为 UIButton。
    • 没错,你不需要。我更喜欢强制转换我的 id,以便编译器可以在我尝试向错误类型的对象发送消息时警告我。
    • 在方法签名中将 sender 声明为 UIButton* 而不是 id。
    【解决方案2】:

    其实是:

    -(IBAction) onClick1: (id) sender {
      NSLog(@"User clicked %@", sender);
      // Do something here with the variable 'sender'
    }
    

    sender 不是NSString,它的类型是id。它只是发送事件的控件。因此,如果在单击按钮时触发了您的方法,则会发送单击的 UIButton 对象。您可以通过编程方式访问所有标准 UIButton 方法和属性。

    【讨论】:

    • 啊,已修复。所以从那里我所要做的就是调用 getTitle 方法?当然,在我将 id 转换为 UIButton 之后?
    • 您实际上甚至不需要投射它。与动态语言中的方法调用相比,这就是消息传递的美妙之处。 :-)
    • 哦,我不认为 getTitle 是您正在寻找的消息。正如马特在他的回答中所说,你会做 [sender currentTitle]。
    • 你还能从 id 中得到什么?你能得到对象的接口生成器“名称”吗?是否有一些关于“id”包含什么的文档?没找到!!
    • id 只是通用的“任何对象”类型。它基本上类似于 C/C++ 中的 void *,除了更智能。不管发件人是什么。例如,对于一个按钮,它将是发送消息的 NSButton 实例。
    【解决方案3】:
    -(IBAction)onClick:(id) sender {
         UIButton *btn = (UIButton *)sender;
    
        //now btn is the same object. And to get title directly
        NSLog(@"Clicked button: %@",[[btn titleLabel] text]);
    }
    

    【讨论】:

      【解决方案4】:

      只需编写以下代码

      -(IBAction) getButtonTitle:(id)sender
      {
           UIButton *button = (UIButton *)sender; 
           NSString *buttonTitle = button.currentTitle;
           NSLog(@"Button Title %@",buttonTitle);
      
      }
      

      就是这样……你已经完成了!!!

      【讨论】:

        【解决方案5】:

        Sender 应该定义为类型 id,而不是 int 或 NSString。发送者是调用该方法的实际对象;如果你将它连接到一个按钮,它将是一个 UIButton,如果它是一个文本字段,一个 UITextField。您可以使用它从控件中获取信息(例如文本字段的当前字符串值),或者如果您有多个控件连接到同一个操作方法,则将其与 IBOutlet 实例变量进行比较。

        【讨论】:

          【解决方案6】:

          您可以使用以下内容获取按钮标签并确定单击了哪个:

          NSLog(@"Clicked button: %@",[[sender titleLabel] text]);
          

          要回答您的问题,id 是来自 IB 的对象。

          【讨论】:

          • 如果发件人是 id 类型,则不允许使用 [sender titleLabel]
          【解决方案7】:

          从按钮中获取文本:

           NSLog(@"Date::%@",[btn titleForState:UIControlStateNormal]);          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-18
            相关资源
            最近更新 更多