Один из подходов может быть использовать 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:)
методы вызываются на инстанции.
Интерфейс пользователя Пример
Изначально "Button" отключена. Когда вы нажмете «+», он станет включенным. Если вы продолжаете нажимать «+», кнопка «Button» останется включенной. Если вы нажмете «Удалить», один элемент будет удален из массива. Если все элементы будут удалены из массива, тогда кнопка «Button» станет отключенной.