【问题标题】:How to use UIButton as Toggle Button?如何使用 UIButton 作为切换按钮?
【发布时间】:2014-05-17 22:49:39
【问题描述】:

我正在尝试为表格中的每个单元格创建一个切换按钮。按下时,它将更改图像,再次按下时将再次更改图像 - 切换。

UIButton 类中,我看不到selected 状态。

我正在寻找一种使用 UIButton 创建切换按钮的方法,以便我可以更改每次单击时的状态。

这就是我现在在rubymotion 中使用rmq 的方式

@fav_button.on(:touch) do |sender|
  puts "pressed fav button for id: " + data[:id] + " and name: " + data[:name]
  #how do I change the state here?
end

【问题讨论】:

    标签: ios iphone uibutton rubymotion rmq


    【解决方案1】:

    您可以轻松创建切换按钮,您只需为各个状态设置相应的图像,然后您可以使用selected属性在这些图像之间切换。

    我制作了一个纯 Objective-c 代码来展示如何做到这一点,但您也可以在 Storyboards 或 Xibs 中设置图像,查看:

    // First, set the images for normal state and selected state
    [button setImage:normalImage forState:UIControlStateNormal];
    [button setImage:selectedImage forState:UIControlStateSelected];
    


    // Don't forget to add an action handler to toggle the selected property
    [button addTarget:self action:@selector(buttonTouch:withEvent:) forControlEvents:UIControlEventTouchUpInside];
    


    // Now, in your button action handler, you can do something like this:
    - (void)buttonTouch:(UIButton *)aButton withEvent:(UIEvent *)event
    {
      aButton.selected = !aButton.selected;
    }
    

    希望对你有帮助。

    【讨论】:

    • 您好,感谢您的回答。当您执行button.selected = !selected 时,!selected 来自哪里?如果我这样做 button.selected = !button.selected 那么我得到一个错误
    • 很好的观察 Anthony,我忘记将按钮范围设置为 selected 属性。我还更改了第一个参数的名称,以免与按钮实例发生冲突。现在更有意义了。谢谢!
    • 样品中仍需要小修。您将按钮命名为“aButton” - 而不是“按钮”。能否请您修复一下以使示例可用?
    【解决方案2】:

    Swift 4.0 解决方案(使用故事板)

    首先,确保在属性检查器中将UIButton 类型设置为Custom

    // Reference to UIButton in Storyboard
    @IBOutlet weak var toggleButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // assumes you have two images in the bundle/project 
        // called normal.png and selected.png.
        let normalImage = UIImage(named: "normal.png")
        let selectedImage = UIImage(named: "selected.png")
    
        toggleButton.setImage(normalImage, for: .normal)
        toggleButton.setImage(selectedImage, for: .selected)
    }
    

    下面的屏幕截图演示了故事板中对toggleButton 的引用,以及Touch Up Inside 事件,即:用户点击按钮,触发下面的didPressButton

    @IBAction func didPressButton(_ sender: Any) {
        
        // if the button was selected, then deselect it.
        // otherwise if it was not selected, then select it.
        toggleButton.isSelected = !toggleButton.isSelected
    
        if toggleButton.isSelected {
            print("I am selected.")
    
        } else {
            print("I am not selected.")
        }
    }
    

    【讨论】:

    • 您也可以在属性检查器中设置 selectedImage 和 normalImage。为此,您只需将“状态配置”从“默认”切换到“已选择”,然后设置所需的图像资产。这样,您只需要 didPressButton 而在 viewDidLoad 中不需要其他代码。
    【解决方案3】:

    由于您的问题确实提到了 rmq,所以这里有一种 rmq 的做法:

    viewDidLoad:

    @hello_world_label = rmq.append(UILabel, :hello_world).get
    @button            = rmq.append(UIButton, :toggleable_button)
    
    @button.on(:touch) do |sender|
      sender.selected = !sender.selected?
    end
    

    请注意,切换是通过查询按钮的实际状态来实现的。如果您需要记住这一点以备后用,您可能需要将其保存在实例变量中。

    在您的样式表中:

    def toggleable_button(st)
      st.frame = {t: 200, w: 100, h: 24}
      st.image_normal = image.resource('toggle_me')
      st.image_selected = image.resource('toggled')
    end
    

    注意image_selected 的使用。嗯,这在 rmq 中不存在,但你可以很容易地做到这一点。如果这是一个 rmq 项目,您将拥有一个 stylers/ 目录。在那里,您应该看到 ui_button_styler.rb。这是使突出显示的状态成为一等公民的代码:

    module RubyMotionQuery
      module Stylers
        class UIButtonStyler < UIControlStyler 
    
          def image_selected=(value)
            @view.setImage(value, forState:UIControlStateSelected)
          end
          def image_selected
            @view.imageForState UIControlStateSelected
          end
    
        end
      end
    end
    

    如您所见,您的控制器代码保持干净,按钮的初始设置已转移到样式表,并且您已巧妙地扩展 rmq 以了解所选状态。

    【讨论】:

      【解决方案4】:

      您可以通过一种非常简单的方法来做到这一点。首先,在您的viewDidLoad 中为您的按钮设置标签。假设self.toggleButton.tag = 111。现在在您的按钮操作功能中,您可以像这样切换按钮:

      - (IBAction)toggling:(id)sender{
          if(self.toggleButton.tag == 111){
              //this is normal state
              [self.toggleButton setTitle:@"Less..." forState:UIControlStateNormal];
              self.toggleButton.tag = 222;
          }else{
              //selected state
              [self.toggleButton setTitle:@"More..." forState:UIControlStateNormal];
              self.toggleButton.tag = 111;
          }
      }
      

      您可以像这样[self.toggleButton setImage://some image forState:UIControlStateNormal]; 更改按钮的图像。这是我认为最简单的方法。希望它会有所帮助。

      【讨论】:

        【解决方案5】:

        我最简单的切换按钮图像的逻辑。 :)

        (IBAction)toggleButton:(id)sender {
               if (self.toggleButton.selected==YES) {
                   [self.toggleButton setSelected:NO];
                }else{
               [self.toggleButton setSelected:YES];
               [self.toggleButton setImage:[UIImage imageNamed:@"favStar.png"]    forState:UIControlStateSelected];
               }
        

        【讨论】:

          猜你喜欢
          • 2010-12-14
          • 1970-01-01
          • 2023-03-10
          • 2014-02-07
          • 2012-05-19
          • 1970-01-01
          • 2018-03-30
          • 2022-11-18
          • 2021-02-24
          相关资源
          最近更新 更多