我如何改变一个UILabel的值从一个不同的类在swift?



我是一名学生,试图在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作为返回类型,但概念在这里。

工作原理:

  1. 在getWeather中,有一个叫做onComplete的闭包,一旦一切完成,它将获得数据。result保存(显然)结果——在这种情况下是一个字符串,它设置uiLabeltext属性为该值。
  2. LoadEvents做它需要做的任何事情,然后在完成后,调用onComplete并通过闭包将结果发送回。

我认为jnpdx将闭包传递给数据管理器的解决方案是最好的答案。

另一种方法是向数据管理器添加委托属性。关于委托,你唯一知道的是它遵循一个特定的协议。然后,您将从数据管理器调用委托上的方法,这些方法将告诉委托可用于显示的数据。委托将决定如何处理这些数据。

我提到这是一种替代方法,但建议使用闭包,就像jnpdx在他们的回答中建议的那样。

最新更新