我如何从 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类型,不过概念在这里。
工作原理:
- 在 getWeather 中,有一个名为
onComplete
的闭包,它会在一切完成后取回数据。 result
保存(显然)结果——在本例中是一个字符串,并将 uiLabel
的 text
属性 设置为该值。
LoadEvents
做任何它需要做的事情,然后在完成后,调用 onComplete
并通过闭包发回结果。
我认为 jnpdx 将闭包传递给数据管理器的解决方案是最佳答案。
您可以执行此操作的另一种方法是向您的数据管理器添加委托 属性。您对委托的唯一了解是它符合特定的协议。然后,您将从数据管理器调用委托的方法,这些方法将告知委托有关可用于显示的数据。代表将决定如何处理该数据。
我提到这是一种替代方法,但建议使用闭包,正如 jnpdx 在他们的回答中所建议的那样。
我是一名试图在 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类型,不过概念在这里。
工作原理:
- 在 getWeather 中,有一个名为
onComplete
的闭包,它会在一切完成后取回数据。result
保存(显然)结果——在本例中是一个字符串,并将uiLabel
的text
属性 设置为该值。 LoadEvents
做任何它需要做的事情,然后在完成后,调用onComplete
并通过闭包发回结果。
我认为 jnpdx 将闭包传递给数据管理器的解决方案是最佳答案。
您可以执行此操作的另一种方法是向您的数据管理器添加委托 属性。您对委托的唯一了解是它符合特定的协议。然后,您将从数据管理器调用委托的方法,这些方法将告知委托有关可用于显示的数据。代表将决定如何处理该数据。
我提到这是一种替代方法,但建议使用闭包,正如 jnpdx 在他们的回答中所建议的那样。