【问题标题】:How would I change the value of a UILabel from a different class in swift?我将如何从不同的类中快速更改 UILabel 的值?
【发布时间】:2021-05-14 17:26:09
【问题描述】:

我是一名试图在 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)
    
}

在 loadEvents 函数中,我得到一个详细说明天气类型的字符串,我想将其作为 UILabel 的文本放入 ViewController 类中,但我不知道该怎么做

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

【问题讨论】:

  • 作为一般规则,您应该将视图控制器的视图视为私有视图。 (这是“封装”原理的一个示例,您将程序(类)的每个部分的内部细节相互隐藏,并且只在类之间使用定义良好的公共接口)@jnpdx 传入的解决方案闭包优雅地解决了这个问题。

标签: ios swift uiviewcontroller uilabel


【解决方案1】:

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

因此,在您的用例中可能如下所示:

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 并通过闭包将结果发回。

【讨论】:

  • 传入闭包是解决问题的好方法。 (已投票)
【解决方案2】:

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

您可以这样做的另一种方法是将委托属性添加到您的数据管理器。您对委托的唯一了解是它符合特定协议。然后,您将从数据管理器调用委托上的方法,这些方法将告诉委托有关可显示的数据。委托将决定如何处理这些数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多