根据条件自动启用按钮

时间:2017-01-04 16:20:57

标签: swift3

我们说我有2个班级AB,其中BA的属性。

A是一个ViewController,包含一个按钮(名为but)。

B包含一个数组(称为arr)。

我希望A.but被禁用,B.arr为空,并且当B.arr不再为空时启用。

按钮是否有好方法可以跟踪此情况并自动启用/禁用自身?

我最初可以设置A.but已停用并在B.arr didSet上更新(如有必要),但我正在寻找一种看起来不像解决方案的解决方案

1 个答案:

答案 0 :(得分:0)

一种方法可能是使用Delegate模式。这将允许您公开在Array添加或删除某些内容时将调用的委托方法。然后,您的ViewController可以符合您的Delegate协议并管理按钮的启用状态。

示例:

  

MyArrayDelegate.swift

protocol MyArrayDelegate: class {
    func didChange(_ myArray: MyArray)
}
  

MyArray.swift

class MyArray {
    weak var delegate: MyArrayDelegate?

    private var _myArray = [Int]()
    var myArray: [Int] {
        return _myArray
    }

    func append(_ element: Int) {
        _myArray.append(element)
        delegate?.didChange(self)
    }

    func remove(at index: Int) -> Int {
        let element = _myArray.remove(at: index)
        delegate?.didChange(self)

        return element
    }
}

append(_:)remove(at:)只需打包标准Array方法。

  

ViewController.swift

class ViewController: UIViewController, MyArrayDelegate {

    @IBOutlet weak var myButton: UIButton!

    private var myArray = MyArray()

    override func viewDidLoad() {
        super.viewDidLoad()
        myArray.delegate = self
        myButton.isEnabled = false
    }

    @IBAction func buttonTapped(_ sender: Any) {
        print(myArray.myArray.count)
    }

    @IBAction func addButtonTapped(_ sender: Any) {
        myArray.append(1)
    }

    @IBAction func removeButtonTapped(_ sender: Any) {
        if myArray.myArray.count > 0 {
            _ = myArray.remove(at: 0)
        }
    }

    func didChange(_ myArray: MyArray) {
        if myArray.myArray.count > 0 {
            myButton.isEnabled = true
        } else {
            myButton.isEnabled = false
        }
    }
}
只要在didChange(_:)个实例上调用append(_:)remove(at:)方法,就会调用

MyArray

  

示例用户界面

enter image description here

最初是"按钮"被禁用。当您点按" +"时,它将变为启用状态。如果您继续点击" +","按钮"将保持启用状态。如果点击"删除",将从阵列中删除一个元素。如果所有元素都从数组中删除,那么" Button"将被禁用。