2017-02-15 28 views
4

У меня есть один UIViewController и UIView (как компонент). Ниже приведен код для компонента.Протоколированное программирование в Swift для пользовательских компонентов

class ProcessingProgressIndicator: UIView { 

    var progressView: UIProgressView! 

    func changeProgress(_ progress: Float) { 
     progressView.progress = progress 
    } 
} 

Поэтому я использую этот компонент в нескольких контроллерах. Поэтому, когда мне нужно изменить значение прогресса, которое я использовал, как показано ниже в моем контроллере.

myProgressView.changeProgress(progress) 

Так, чтобы компонент Component Oriented был добавлен ниже в код.

protocol ProgressUpdateable { 
    func updateWith(progressView: ProcessingProgressIndicator,progress: Float) 
} 

extension ProgressUpdateable { 
    func updateWith(progressView: ProcessingProgressIndicator,progress: Float) { 
     // Method gets called and can change progress 
    } 
} 

Так от моего контроллера, я вызываю метод, как показано ниже

updateWith(progressView: progressView,progress: progressData.progress) 

Это, как я сделал это протокол ориентированный.

Итак, мой вопрос: Правильный ли это способ реализации?

Мне нужно передать объект progressView, могу ли я от него избавиться?

+0

Вам нужно будет сделать свой собственный компонент, соответствовать протоколу, а затем использовать его для вызова метода. Где путаница? –

+0

Можете ли вы описать, как это сделать, чтобы соответствовать протоколу? –

+0

@parth Adroja убедитесь, что ваш первый контроллер знает о втором контроллере, подтвердив его делегату. –

ответ

4

Так, чтобы компонент Component Oriented был добавлен ниже в код.

protocol ProgressUpdateable { 
    func updateWith(progressView: ProcessingProgressIndicator,progress: Float) 
} 

extension ProgressUpdateable { 
    func updateWith(progressView: ProcessingProgressIndicator,progress: Float) { 
     // Method gets called and can change progress 
    } 
} 
So from my controller, I call method as below 

updateWith(progressView: progressView,progress: progressData.progress) 

Вот как я сделал это протокол ориентированным.

0

Что вы говорите, это использование протоколов для делегирования.

This - документация Apple, очень хорошо отредактированная Я могу сказать, где они объясняют все протоколы. Прочитайте все, но перейдите на сеанс «Делегация», чтобы увидеть, что именно вы ищете.

0

Если ваше внимание, чтобы добиться этого посредством делегирования (есть и другие варианты, например, возвращая значение прогресса в параметре закрытия), он должен быть похож на:

protocol CustomComponentDelegate { 
    func customComponentProgressDidStartUpdate(component: UIView, progressValue: Float) 
} 

class CustomComponent: UIView { 

    var delegate:CustomComponentDelegate? 

    // ... 

    func updateProgressValue(progress: Float) { 
     progressView.progress = progress/100.0 
     progressLabel.text = "\(Int(progress)) %" 

     delegate?.customComponentProgressDidStartUpdate(component: self, progressValue: progressView.progress) 
     // or you might want to send (progress/100.0) instead of (progressView.progress) 
    } 

    // ... 
} 

Я предположил, что пользовательский компонент является подклассом UIView, это не должно иметь значения.

Использование:

class ViewController: UIViewController, CustomComponentDelegate { 
    //... 

    // or it might be an IBOutlet 
    var customComponent: CustomComponent? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //... 

     customComponent?.delegate = self 
    } 

    func customComponentProgressDidStartUpdate(component: UIView, progressValue: Float) { 
     // do whatever you want with the returned values 
    } 
} 

Обратите внимание, что если updateProgressValue сфера обновления значение прогресса как в реальном времени, то customComponentProgressDidStartUpdate метод делегата должен быть также выполнен как в режиме реального времени.

Кроме того, вы можете проверить this question/answer, чтобы узнать больше о том, что здесь происходит.

Надеюсь, это помогло.

+0

На самом деле, это не я ищу, ваш случай похож на Контроллер возвращает значение от прогресса. То, что я пытаюсь сделать, это то, что контроллер будет отправлять значение прогресса компоненту с использованием протокола, и компонент будет делать соответствующие вещи. Ваш случай на самом деле наоборот, чем я хочу. –

+0

Итак, вы имеете в виду, что 'updateProgressValue' существует в контроллере? и вы хотите отправить его в customView? –

+0

Это компонент, и я использую его как object.method, но я ищу другой способ сделать это. –