【发布时间】:2020-10-09 19:10:24
【问题描述】:
例如,我有一个 SwitUI ContentView。当您第一次制作项目时出现的那个。
import SwiftUI
struct ContentView: View {
var manager = TestManager()
var body: some View {
ZStack{
Color(.green)
.edgesIgnoringSafeArea(.all)
VStack {
Text("Test Text")
Button(action:{}) {
Text("Get number 2")
.font(.title)
.foregroundColor(.white)
.padding()
.overlay(RoundedRectangle(cornerRadius: 30)
.stroke(Color.white, lineWidth: 5))
}
}
}
}
}
我有一个将处理 Api 调用的 TestManager。我为具有两个功能的类创建了一个委托。
protocol TestManagerDelegate {
func didCorrectlyComplete(_ testName: TestManager, model: TestModel)
func didFailWithError(_ error: Error)
}
struct TestManager {
var delegate: TestManagerDelegate?
let urlString = "http://numbersapi.com/2/trivia?json"
func Get(){
if let url = URL(string: urlString){
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil{
self.delegate?.didFailWithError(error!)
return
}
if let safeData = data{
if let parsedData = self.parseJson(safeData){
self.delegate?.didCorrectlyComplete(self, model: parsedData)
}
}
}
task.resume()
}
}
func parseJson(_ jsonData: Data) -> TestModel?{
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(TestModel.self, from: jsonData)
let mes = decodedData.message
let model = TestModel(message: mes)
return model
} catch {
delegate?.didFailWithError(error)
return nil
}
}
}
这是 testModel 数据类。只抓取返回的 Json 的文本。
struct TestModel :Decodable{
let text: String
}
如何将 TestManager 连接到视图并让视图处理委托,就像我们在情节提要中所做的那样?
【问题讨论】:
-
寻找 MVVM 模式——这对于 SwiftUI 来说比委托更自然,即你可以使用 ViewModel 作为视图和管理器之间的线索;当然,它也可以扮演代理角色,但对我来说似乎是多余的。
-
我查找了 MVVM,所以它与我在下面标记为正确的 ObservableObject 答案基本相同?它不是所有相同的步骤,但足够相似以至于它遵循将视图绑定到 ViewModel 的相同模式?
标签: ios delegates swiftui delegation