Как использовать UIButton в качестве кнопки переключения?

Я пытаюсь создать кнопку переключения для каждой ячейки в моей таблице. При нажатии он изменит изображение, а при повторном нажатии он снова изменит изображение -- Toggle.

В классе 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

person Anthony    schedule 05.04.2014    source источник


Ответы (5)


Вы можете легко создать кнопку переключения, вам просто нужно установить соответствующие изображения для соответствующих состояний, после чего вы можете использовать свойство 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;
}

Я надеюсь это тебе поможет.

person Jan Cássio    schedule 05.04.2014
comment
Привет, спасибо за ответ. Когда вы делаете button.selected = !selected, откуда исходит !selected? если я делаю button.selected = !button.selected то получаю ошибку - person Anthony; 05.04.2014
comment
Хорошее наблюдение, Энтони, я забыл указать область действия кнопки для свойства selected. Также я изменил имя первого параметра, чтобы не конфликтовать с экземпляром кнопки. Теперь это имеет больше смысла. Спасибо! - person Jan Cássio; 05.04.2014
comment
все же требуется небольшой ремонт в образце. вы назвали кнопку aButton - не кнопка. Не могли бы вы исправить это, чтобы сделать образец пригодным для использования? - person Motti Shneor; 28.11.2016

Решение Swift 4.0 (с использованием раскадровок)

Во-первых, убедитесь, что для параметра UIButton Type установлено значение 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 в раскадровке и 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.")
    }
}
person JaredH    schedule 01.11.2017
comment
Вы также можете установить selectedImage и normalImage в инспекторе атрибутов. Для этого вам нужно всего лишь переключить конфигурацию состояния с «По умолчанию» на «Выбрано», а затем установить нужные активы изображения. Таким образом, вам нужен только didPressButton и никакой другой код в viewDidLoad. - person Flupp; 17.01.2018

Поскольку в вашем вопросе упоминается rmq, вот способ rmq:

In 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 для понимания выбранного состояния.

person Steve Ross    schedule 11.05.2014

Вы можете сделать это очень простым способом. Прежде всего, в вашем 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];. Это самый простой способ, я думаю. Надеюсь, это поможет.

person Julfikar    schedule 06.10.2017

Моя самая простая логика для переключения изображения кнопки. :)

(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];
       }
person Hic Up    schedule 26.06.2015