J'essaie de créer un bouton bascule pour chaque cellule de mon tableau. Si vous appuyez dessus, l'image changera et, une nouvelle fois, changera encore l'image - Basculer.
Dans la classe UIButton
, je ne vois pas d'état selected
.
Je cherche un moyen de créer un bouton bascule avec UIButton afin de pouvoir changer l'état de chaque clic.
Voici comment je le fais dans rubymotion
en utilisant maintenant 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
Vous pouvez facilement créer un bouton bascule. Il vous suffit de définir les images respectives pour les états respectifs. Vous pouvez ensuite utiliser la propriété selected
pour basculer entre ces images.
J'ai créé un code objectif-c pur pour montrer comment vous pouvez le faire, mais vous pouvez aussi définir les images dans Storyboards ou Xibs également, consultez:
// 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;
}
J'espère que cela pourra vous aider.
Solution Swift 4.0 (à l'aide de Storyboards)
Premièrement, assurez-vous que le type UIButton
est défini sur Custom
dans l'inspecteur d'attributs.
// 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)
}
La capture d'écran ci-dessous illustre les références à toggleButton
dans Storyboard et à Touch Up Inside
Event, c'est-à-dire qu'un utilisateur appuie sur le bouton qui déclenche didPressButton
ci-dessous.
@IBAction func didPressButton(_ sender: Any) {
// if the button was selected, then deselect it.
// otherwise if it was not selected, then select it.
toggleButton.isSelected = !trackingButton.isSelected
if toggleButton.isSelected {
print("I am selected.")
} else {
print("I am not selected.")
}
}
Puisque votre question a effectivement mentionné rmq, voici une façon de le faire:
Dans 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
Notez que le basculement est réalisé en interrogeant l'état actuel du bouton. Si vous devez vous en souvenir pour une utilisation ultérieure, vous pouvez enregistrer cette information dans une variable d'instance.
Dans votre feuille de style:
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
Notez l'utilisation de image_selected
. Cela n’existe pas dans rmq, mais vous pouvez y arriver assez facilement. S'il s'agit d'un projet rmq, vous aurez un répertoire stylers /. Vous devriez y voir ui_button_styler.rb. Voici le code pour faire de l’état mis en surbrillance un citoyen de première classe:
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
Comme vous pouvez le constater, le code de votre contrôleur reste propre, les paramètres initiaux du bouton sont décalés vers la feuille de style et vous avez nettement étendu rmq pour comprendre l'état sélectionné.
Vous pouvez le faire dans une approche très facile. Tout d’abord, dans votre balise viewDidLoad
pour votre bouton. Disons self.toggleButton.tag = 111
. Maintenant, dans votre fonction d'action de bouton, vous pouvez basculer le bouton comme suit:
- (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;
}
}
Vous pouvez changer l'image du bouton comme ceci: [self.toggleButton setImage://some image forState:UIControlStateNormal];
. C'est le moyen le plus simple, à mon avis. J'espère que ça va aider.
Ma logique la plus simple pour basculer l'image du bouton. :)
(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];
}