протокол не возвращает значение - PullRequest
0 голосов
/ 11 января 2019

Я изучаю протокол и получил пробелем

ViewController1.swift

protocol filterApplied {
    func appliedFiiler(isApplied: Bool)
}

class  : UIViewController{
   var delegate : filterApplied?


   // on some button action
    delegate?.appliedFiiler(isApplied: true)
}



ViewController2.swift

class ViewController2 : UIViewController,filterApplied {
         func appliedFiiler(isApplied: Bool) {
        if isApplied{
            filterButton.imageView?.image = UIImage(named: "filter_applied")
        }
    }
}

теперь я знаю, что это ничего не сделает

поскольку я не назначил делегата себе.

как и где я могу это сделать, чтобы функция applyFilterFunction в файле 2 swift работала?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы можете захотеть что-то вроде этого

//ViewController1.swift
// definition
protocol FilterApplied: class {
    var filterButton: UIButton! { get set }
    func appliedFilter(isApplied: Bool)
}
// defaults protocol behaviour
extension FilterApplied {
    //
    func appliedFilter(isApplied: Bool) {
        if isApplied{
            filterButton.imageView?.image = UIImage(named: "filter_applied")
        }
    }
}


//ViewController2.swift

class ViewController2: UIViewController, FilterApplied {

    @IBOutlet var filterButton: UIButton! {
        didSet {
            // used defaults
            appliedFilter(isApplied: true)
        }
    }
    // overrides defaults
    func appliedFilter(isApplied: Bool) {

    }
} 

В конце вы можете выбрать использование поведения по умолчанию или добавить новое.

0 голосов
/ 11 января 2019

Вы должны подключить делегат к себе из ViewController2.

 protocol FilterApplied {

     func appliedFiiler(isApplied: Bool)

 }

 Class ViewController1: UIViewController {

     var delegate: FilterApplied?


 @IBaction func onClick() {

    self.delegate?.appliedFiiler(isApplied: true)

  }

В Viewcontroller2 вы должны подключить делегата к себе. С помощью навигации контроллера или представления контроллера. В этом случае я подключился к представлению контроллера.

 Class ViewController2: UIViewController, FilterApplied {


    func onPresent() {

        let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController1") as! ViewController1
        vc.delegate = self
        self.present(vc, animated: false, completion: nil)

   }


   func appliedFilter(isApplied: Bool) {

        if isApplied{

           filterButton.imageView?.image = UIImage(named: "filter_applied")

        }

   }


}
...