25

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

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
4

5 回答 5

44

您可以轻松创建切换按钮,您只需为各个状态设置相应的图像,之后,您可以使用该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;
}

我希望这可以帮助你。

于 2014-04-05T16:35:01.483 回答
6

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

首先,确保在 Attributes Inspector中将UIButtonType 设置为。Custom

确保 UIButton 类型设置为自定义

// 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了 Storyboard 和Touch Up InsideEvent 中的引用,即:用户点击按钮,该按钮在下方触发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.")
    }
}
于 2017-11-01T15:34:58.497 回答
1

由于您的问题确实提到了 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 以了解所选状态。

于 2014-05-11T21:37:00.290 回答
1

你可以用一种非常简单的方法来做到这一点。首先,在您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];这是我认为最简单的方法。希望它会有所帮助。

于 2017-10-06T10:37:43.887 回答
0

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

(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];
       }
于 2015-06-26T10:25:12.717 回答