swift - Swift ui mac os 扩展委托视图是可能的
问题描述
我有以下代码,单击该按钮可以让我clone
打开.repository
github
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()
}
}
我正在使用以下框架来告诉我是否要为跟踪事件实现delegate
协议framework
,我必须这样做:
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
是否可以扩展 astruct
类型View
?
你能给我一些建议吗?
解决方案
举个例子,作者说要为委托创建或使用 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)
}
}
推荐阅读
- python - 变量中的 C++ 二进制
- numpy - Matplotlib 条形图和 Seaborn 热图:共享相同的 X 轴
- wordpress - 在 wordpress 页面中使用变量并定期更新它们
- php - 如何仅将过滤器应用于新订单电子邮件(wordpress、woocommerce)
- batch-file - 如何在批处理中绕过打开文件安全警告作为启动命令的一部分?
- ruby-on-rails - 在 Rails 5 中,“model.save”和“model.errors.empty”之间是否存在功能差异?
- python - Youtubedl CERTIFICATE_VERIFY_FAILED
- liquibase - 如何使用 diffExcludeObjects 配置忽略所有表中以 id 结尾的所有列?
- java - JavaMail:MimeMessage 在预期 HTML 时以纯文本形式发送?
- html - 更改引导导航栏默认背景颜色