我有一个$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的对象吗?我能摆脱它吗?
答案 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以了解有关此处发生的事情的更多信息。
希望这会有所帮助。