Swift中面向协议的编程,用于定制组件

时间:2017-02-15 06:15:22

标签: ios swift swift-protocols

我有一个$image="path-to-your-image"; //this can also be a url $filename = basename($image); $file_extension = strtolower(substr(strrchr($filename,"."),1)); switch( $file_extension ) { case "gif": $ctype="image/gif"; break; case "png": $ctype="image/png"; break; case "jpeg": case "jpg": $ctype="image/jpeg"; break; default: } header('Content-type: ' . $ctype); $image = file_get_contents($image); echo $image; UIViewController(作为组件)。下面是组件的代码。

UIView

所以我在多个控制器中使用这个组件。因此,当我需要更改我在控制器中使用的进度值时。

class ProcessingProgressIndicator: UIView {

   var progressView: UIProgressView!

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

因此,为了使下面添加的Protocol Oriented组件成为代码。

 myProgressView.changeProgress(progress)

所以从我的控制器,我调用方法如下

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

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

这就是我使其面向协议的方式。

所以我的问题是:这是正确的实施方式吗?

我需要传递progressView的对象吗?我能摆脱它吗?

2 个答案:

答案 0 :(得分:0)

您所说的是使用授权协议。

This是Apple文档,我可以说,编辑得很好,他们在那里解释了有关协议的所有内容。阅读所有内容,但跳转到代表团会议,以确切了解您的需求。

答案 1 :(得分: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以了解有关此处发生的事情的更多信息。

希望这会有所帮助。