我们说我有2个班级A
和B
,其中B
是A
的属性。
A
是一个ViewController,包含一个按钮(名为but
)。
B
包含一个数组(称为arr
)。
我希望A.but
被禁用,B.arr
为空,并且当B.arr
不再为空时启用。
按钮是否有好方法可以跟踪此情况并自动启用/禁用自身?
我最初可以设置A.but
已停用并在B.arr didSet
上更新(如有必要),但我正在寻找一种看起来不像解决方案的解决方案
答案 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
。
示例用户界面
最初是"按钮"被禁用。当您点按" +"时,它将变为启用状态。如果您继续点击" +","按钮"将保持启用状态。如果点击"删除",将从阵列中删除一个元素。如果所有元素都从数组中删除,那么" Button"将被禁用。