2017-01-04 4 views
0

Предположим, у меня есть 2 класса, A и B, где B - это атрибут A.Кнопка автоматического включения в соответствии с условием

A является ViewController и содержит кнопку (называемую but).

B содержит массив (называемый arr).

Я хочу, чтобы A.but всегда был отключен B.arr пуст и включен, когда B.arr больше не пуст.

Есть ли хороший способ для кнопки отслеживать это и автоматически включать/отключать себя?


я мог установить первоначально A.but инвалидов и обновить его (при необходимости) на B.arr didSet, но я искал решение, которое не выглядит как обходной путь

ответ

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:) методы вызываются на инстанции.

Интерфейс пользователя Пример

enter image description here

Изначально "Button" отключена. Когда вы нажмете «+», он станет включенным. Если вы продолжаете нажимать «+», кнопка «Button» останется включенной. Если вы нажмете «Удалить», один элемент будет удален из массива. Если все элементы будут удалены из массива, тогда кнопка «Button» станет отключенной.

Смежные вопросы