Swift ui mac os扩展委托视图是可能的



我有以下代码,单击该按钮可以clonegithub上的repository

import SwiftUI
import Git
struct File: View {
@State var pathUrl = "https://github.com/way-to-code/git-macOS.git"
@State var nameDir = "/Users/"

func cloneReport() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let url: URL = URL(string: pathUrl)!
let report = GitRepository(from: url)
//report.delegate = progressTracker
do {
try report.clone(at: nameDir)
} catch let e {
print("Errors (e).")
}
}
}

var body: some View {
Button(action: {
cloneReport()
}) {
Text("Clone").frame(width: 330)
}
}
}
struct File_Previews: PreviewProvider {
static var previews: some View {
File()
}
}

我正在使用告诉我的以下框架,如果我想实现用于跟踪事件的framework协议的delegate,我必须这样做:

let progressTracker = MyCustomObject()
let repository: GitRepository
repository.delegate = progressTracker
// implement RepositoryDelegate protocol in order to track the events
extension MyCustomObject: RepositoryDelegate {
func repository(_ repository: Repository, didProgressClone progress: String) {
}
}

我不能对不存在的类执行extension,这给了我以下错误:Cannot find type 'MyCustomObject' in scope

是否可以扩展类型为Viewstruct

你能给我一些建议吗?

一个例子,作者说为委托创建或使用MyCustomObject类。

您必须创建一个用于跟踪的类。

首先,创建一个与MyCustomObject 相同的类

class ProgressTracker: RepositoryDelegate {
func repository(_ repository: Repository, didProgressClone progress: String) {
print(progress) // Here you will get progress
}
}

并在视图内配置

struct File: View {
@State var pathUrl = "https://github.com/way-to-code/git-macOS.git"
@State var nameDir = "/Users/"

let progressTracker = ProgressTracker()  // << === Here

func cloneReport() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let url: URL = URL(string: pathUrl)!
let report = GitRepository(from: url)
report.delegate = progressTracker // << === Here

do {
try report.clone(at: nameDir)
} catch let e {
print("Errors (e).")
}
}
}


如果您想在文件视图中查看进度,可以这样设置视图。

struct File: View {
@State var pathUrl = "https://github.com/way-to-code/git-macOS.git"
@State var nameDir = "/Users/"

var progressTracker = ProgressTracker()  // << === Here

func cloneReport() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let url: URL = URL(string: pathUrl)!
let report = GitRepository(from: url)
report.delegate = progressTracker // << === Here

progressTracker.progressBlock = { progress in // << === Here
print(progress)
}

do {
try report.clone(at: nameDir)
} catch let e {
print("Errors (e).")
}
}
}

var body: some View {
Button(action: {
cloneReport()
}) {
Text("Clone").frame(width: 330)
}
}
}
// implement RepositoryDelegate protocol in order to track the events
class ProgressTracker: RepositoryDelegate {
lazy var progressBlock: ((String) -> Void)? = nil

func repository(_ repository: Repository, didProgressClone progress: String) {
self.progressBlock?(progress)
}
}

最新更新