微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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()
    }
}

我正在使用以下 framework,它告诉我是否要为跟踪事件实现 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) {
 }
}

I can't do extension of a class that does not exist 给我以下错误Cannot find type 'MyCustomObject' in scope

是否可以扩展 struct 类型的 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)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。