【问题标题】:Swift ui mac os extension delegate view is possibleSwiftui macos 扩展委托视图是可能的
【发布时间】:2021-09-20 11:21:01
【问题描述】:

我有以下代码,单击该按钮可以让我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,它告诉我是否要为跟踪事件实现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

是否可以扩展View 类型的struct

你能给我一些建议吗?

【问题讨论】:

    标签: swift xcode macos swiftui delegates


    【解决方案1】:

    一个例子,作者说为委托创建或使用 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)
        }
    }
    

    【讨论】:

    • 我照你说的做了,问题是什么都没有印在我身上。我尝试了位于ProgressTracker 内的repository 函数。我也试过在progressBlock里面View里面。
    • 似乎从未调用过repository函数。
    • 我也尝试过先定义一个空类,然后在扩展中定义函数,但还是不行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2015-03-22
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多