我如何从 swift 中的不同 class 更改 UILabel 的值?

How would I change the value of a UILabel from a different class in swift?

我是一名试图在 Xcode 中制作应用程序的学生,但我 运行 遇到了一个我无法找到解决方案的问题。我想访问存储在另一个 class 中的字符串,并将其作为我的 ViewController.

的标签文本

在我的 ViewController 中,我调用了一个不同的 class,然后它通过一个 API 调用并找到了一个详细说明某个地方天气的字符串。这是我的 ViewController class

中的通话内容
func getWeather() {
   
    manager = DataManager()
    manager.fetchData(query: getQueryString();
}

这就是来自 DataManager 的调用的样子 Class

  func rainyWeatherPopulate(str: String){

    LoadEvents.loadEvents(type: EventType.rain, str: str)
    
}

在 loadEvents 函数中,我得到了一个字符串,详细说明了我想作为 UILabel 文本放入我的 ViewController class 中的天气类型,但我不确定该怎么做所以

有没有什么方法可以将我的 ViewController 的实例传递给我的 loadEvents 静态函数,或者我可以通过任何其他方法在我的 ViewController 中设置 UILabel 的文本LoadEvents class?

有很多潜在的方法可以解决这个问题,但一种方法是传递一个在调用完成时使用的闭包。

因此,在您的用例中它可能看起来像这样:

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 作为 return类型,不过概念在这里。

工作原理:

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

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

您可以执行此操作的另一种方法是向您的数据管理器添加委托 属性。您对委托的唯一了解是它符合特定的协议。然后,您将从数据管理器调用委托的方法,这些方法将告知委托有关可用于显示的数据。代表将决定如何处理该数据。

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