【问题标题】:Need to fix my checkboxes: to change states in one click instead of two clicks. Swift 3, IOS需要修复我的复选框:一键更改状态,而不是单击两次。斯威夫特 3,IOS
【发布时间】:2017-03-07 12:38:51
【问题描述】:

我有多个可以正常工作的复选框。 它的工作方式是有两个图像(一个选中框的图像或一个未选中框的图像)显示或消失在我的按钮中,基于单击该按钮。

由于某种原因,当我第一次单击复选框时,它可以正常工作(将其状态更改为:选中或未选中 - 单击一次时),但是当我尝试第二个、第三个或第四个(等等)复选框,它需要两次单击才能更改其状态(选中/未选中)。

这对用户来说很烦人和困惑。有没有办法解决?

这是我最后的 3 个复选框:

/////Checkboxes

@IBOutlet weak var Box49: UIButton!

@IBOutlet weak var Box50: UIButton!

@IBOutlet weak var Box51: UIButton!



var BoxON = UIImage(named: "CheckBox")
var BoxOFF = UIImage(named:"UnCheckBox")

var isBoxClicked: Bool!


override func viewDidLoad() {
    super.viewDidLoad()

    isBoxClicked = false
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func Box49(_ sender: Any) {

    if isBoxClicked == true{
        isBoxClicked = false
    }else{
        isBoxClicked = true
    }
    if isBoxClicked == true{
        Box49.setImage(BoxON, for: UIControlState.normal)

    }else{
        Box49.setImage(BoxOFF, for: UIControlState.normal)
    }
}


@IBAction func Box50(_ sender: Any) {

    if isBoxClicked == true{
        isBoxClicked = false
    }else{
        isBoxClicked = true
    }
    if isBoxClicked == true{
        Box50.setImage(BoxON, for: UIControlState.normal)

    }else{
        Box50.setImage(BoxOFF, for: UIControlState.normal)
    }
}


@IBAction func Box51(_ sender: Any) {

    if isBoxClicked == true{
        isBoxClicked = false
    }else{
        isBoxClicked = true
    }
    if isBoxClicked == true{
        Box51.setImage(BoxON, for: UIControlState.normal)

    }else{
        Box51.setImage(BoxOFF, for: UIControlState.normal)
    }
}

谢谢,丹

【问题讨论】:

    标签: ios checkbox swift3


    【解决方案1】:

    您使用与所有按钮相同的实例属性isBoxClicked 的问题,而不是您需要将图像设置为状态正常和选定的所有按钮,然后在您的按钮操作中简单地更改其选定状态。 也可以更改您的按钮插座名称或操作名称,因为它们都是相同的。所以应该是这样的。

    @IBOutlet var box49: UIButton!
    @IBOutlet var box50: UIButton!
    @IBOutlet var box51: UIButton!
    
    
    override func viewDidLoad() {
         super.viewDidLoad()
    
         box49.setImage(BoxOFF, for: .normal)
         box49.setImage(BoxON, for: .selected)
    
         box50.setImage(BoxOFF, for: .normal)
         box50.setImage(BoxON, for: .selected)
    
         box51.setImage(BoxOFF, for: .normal)
         box51.setImage(BoxON, for: .selected)
    } 
    

    现在以这种方式设置您的按钮操作。

    @IBAction func box49Button(_ sender: Button) {
         sender.isSelected = !sender.isSelected
    }
    
    @IBAction func box50Button(_ sender: Button) {
         sender.isSelected = !sender.isSelected
    }
    
    @IBAction func box51Button(_ sender: Button) {
         sender.isSelected = !sender.isSelected
    }
    

    或者您可以添加单个按钮操作并将该操作设置为所有三个按钮,而不是像这样为每个按钮设置三个不同的操作。

    @IBAction func boxButton(_ sender: Button) {
         sender.isSelected = !sender.isSelected
    }
    

    【讨论】:

    • 如何完整地写出来?我不断收到错误。我不确定我在这里做错了什么
    • @DanielG 你遇到了什么错误 如果可能的话,用你尝试过的代码编辑你的问题 显示错误的屏幕截图。
    • @DanielG 您需要在 ViewDidlLoad 中设置此图像,再次检查我的答案,您在 didReceiveMemoryWarning 中设置图像。
    • UIButton 类型的值没有成员集图像
    • 我在其他帖子中做过! :)
    【解决方案2】:

    您正在为所有按钮使用isBoxClicked 变量的一个实例。您应该创建一个isBoxClicked 数组。通过使用数组,您可以进一步检查哪个复选框(UIButon)被选中,哪个未被选中。

    var isBoxClickedArray:[int] = {0,0}
    

    首先为获取按钮索引创建枚举

    enum  ButtonIndex{
    case Box49
    case Box50
    }
    

    将枚​​举值分配为按钮中的标记

    Box49Button.tag = ButtonIndex.Box49.rawValue
    Box50Button.tag = ButtonIndex.Box50.rawValue
    

    为获取操作创建一种方法

     @IBAction func actionType(_ sender: Any) {
            let button = sender as! UIBarButton
            if ( button.tag == ButtonIndex.BOX49.rawValue ){
                print("Box49 button pressed")
                if ( isBoxClicked[ButtonIndex.BOX49.rawValue] == 0 ){
                      print("box49 is unchecked")
                      isBoxClicked[ButtonIndex.BOX49.rawValue] = 1// change  it's value to checked
                      // change image also
                }else{
                    // box is checked
                    isBoxClicked[ButtonIndex.BOX49.rawValue]  = 0
                    // change value in array and image also
                }
            }else{
                print("Box50 button pressed")
            }
        }
    

    更新

    在视图控制器中声明数组。如果您使用的是 tableview,则在 viewdidload 或 cellforrowAtindexpath 中的按钮上分配标签。对于枚举,像这样声明它们

    import UIKit
    enum indexs : Int{
        case first
        case second
    }
    
    class ViewController: UIViewController {
    

    【讨论】:

    • 我似乎无法将它们全部写在一起。我有点失落。您将如何获得预期的声明(对于您的 var)或预期的表达式(对于您的枚举)?
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2023-03-17
    相关资源
    最近更新 更多