我是一名学生,试图在Xcode中制作应用程序,我遇到了一个问题,我无法找出解决方案。我想访问一个字符串,我已经存储在另一个类,使其成为我的ViewController的标签文本。
在我的ViewController中,我调用一个不同的类,然后它通过API调用并找到一个详细说明某个地方天气的字符串。这是我的ViewController类
中调用的样子func getWeather() {
manager = DataManager()
manager.fetchData(query: getQueryString();
}
这是DataManager类的调用
func rainyWeatherPopulate(str: String){
LoadEvents.loadEvents(type: EventType.rain, str: str)
}
在loaddevents函数中,我得到了一个字符串,详细说明了我想在ViewController类中作为UILabel文本的天气类型,我不确定如何这样做
是否有任何方式,我可以传递我的ViewController的实例到我的loaddevents静态函数或任何其他方式,我可以设置一个UILabel在我的ViewController从loaddevents类的文本?
有许多可能的方法可以解决这个问题,其中一种方法是传递一个闭包,在调用完成时使用。
那么,在你的用例中,它可能看起来像这样:
class DataManager {
func fetchData(query: String, onComplete: @escaping (String) -> Void) {
LoadEvents.loadEvents(type: .rain, str: query, onComplete: onComplete)
}
}
enum EventType {
case rain
}
class LoadEvents {
static func loadEvents(type: EventType, str: String, onComplete: (String) -> Void) {
//load the data
//then, when it's done, call the completion
onComplete("returnedData")
}
}
func getWeather() {
let manager = DataManager()
let uiLabel = UILabel()
manager.fetchData(query: "queryString", onComplete: { result in
uiLabel.text = result
})
}
我不得不模拟出一些东西(如EventType
),我没有关于你正在加载的事件类型的信息,所以我只是使用了一个通用的String
作为返回类型,但概念在这里。
工作原理:
- 在getWeather中,有一个叫做
onComplete
的闭包,一旦一切完成,它将获得数据。result
保存(显然)结果——在这种情况下是一个字符串,它设置uiLabel
的text
属性为该值。 LoadEvents
做它需要做的任何事情,然后在完成后,调用onComplete
并通过闭包将结果发送回。
我认为jnpdx将闭包传递给数据管理器的解决方案是最好的答案。
另一种方法是向数据管理器添加委托属性。关于委托,你唯一知道的是它遵循一个特定的协议。然后,您将从数据管理器调用委托上的方法,这些方法将告诉委托可用于显示的数据。委托将决定如何处理这些数据。
我提到这是一种替代方法,但建议使用闭包,就像jnpdx在他们的回答中建议的那样。