当前位置: 首页 > 面试题库 >

在Swift闭包内更新的UILabel文本拒绝显示

皇甫夕
2023-03-14
问题内容

在学习Swift时,我正在编写一个简单的实践iOS应用程序,以从站点中抓取给定城市的天气信息,并将其显示在UILabel中。

该代码使用“ NSURLSession.sharedSession()。dataTaskWithURL”闭包。尽管我能够正确获取数据并在“
UILabel.text”中捕获相关文本,但是我无法获得实际的应用程序来显示更新的UILabel。

我究竟做错了什么?以下是相关代码:

@IBAction func buttonPressed(sender: AnyObject) {

   var urlString = "http://www.weather-forecast.com/locations/" + cityName.text.stringByReplacingOccurrencesOfString(" ", withString: "") + "/forecasts/latest"

   var url = NSURL(string: urlString)

   let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in

      var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as String

      var contentArray = urlContent.componentsSeparatedByString("<span class=\"phrase\">")
      var weatherInfo = contentArray[1].componentsSeparatedByString("</span>")

      self.resultShow.text = weatherInfo[0] // Text does not show in the app

      println(weatherInfo[0]) // This works correctly
      println(self.resultShow.text) // This works correctly

   }

   task.resume()

}

问题答案:

您需要在主线程上执行UI更新

NSURLSession完成处理程序将始终在后台线程上调用。要更新您的UI,一个简单dispatch_async的主线程就足够了:)

@IBAction func buttonPressed(sender: AnyObject) {
   var urlString = "http://www.weather-forecast.com/locations/" + cityName.text.stringByReplacingOccurrencesOfString(" ", withString: "") + "/forecasts/latest"
   var url = NSURL(string: urlString)
   let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in

      var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as String

      var contentArray = urlContent.componentsSeparatedByString("<span class=\"phrase\">")
      var weatherInfo = contentArray[1].componentsSeparatedByString("</span>")

      dispatch_async(dispatch_get_main_queue(), {
          //perform all UI stuff here        
          self.resultShow.text = weatherInfo[0] 
      })
   }
   task.resume()
}

编辑

尽管由于不保留闭包而在这里并不重要,但在某些情况下,显式声明捕获列表以避免保留周期很重要。



 类似资料:
  • 我已经将我的代码更新到Xcode 8.0 beta 6,但我陷入了关于新的非转义闭包默认值的困境。在下面的代码中,Xcode建议在完成之前添加在下面代码的第一行中,但这仍然不会编译并循环。* (编辑:事实上,@escaping应该在,正如Xcode所建议的那样。警报可能仍会显示,但清理和编译会将其删除。* 如何重写/修复此代码才能在更新的 Swift 3 中工作?我已经查看了新手册,但我找不到正确

  • 我创建了一个新的repo,克隆了它,将文件添加到目录中,用添加、提交的更改添加了它们,当我尝试使用git push推送时 提示:更新被拒绝,因为远程包含您在本地没有的工作。这通常是由另一个存储库推送到同一个引用引起的。您可能希望在再次推送之前,首先合并远程更改(例如提示:“git pull”)。 这似乎没有意义,因为这是一个新的回购协议,只包含一个自述文件。

  • 问题内容: 我在使用iOS SDK 8的Swift时遇到一个问题 我使用了回调来获取数据背景,并且在获取数据时,我想设置一个文本字段值并更新屏幕。 这是我的代码: 运行此代码,将正确获取数据并且txtTest没有更新,但是当我点击txtTest时,将显示该值。那么有什么方法可以强制更新UI?或向UI线程发送消息? 问题答案: 每个人都想在Swift中进行UI更新时遇到的同一问题:永远不要在任何辅助

  • 问题内容: 刚开始学习Swift并创建了一个小小的macOS应用程序,我想在其中使用a 来显示属性字符串。我试过了: 但这似乎不起作用。感到困惑,因为对a进行完全相同的操作就像一种魅力。 我在这里想念什么? 问题答案: 似乎Xcode的早期beta版本(带有Swift)具有这种出口的严重问题(如您在此处看到:http : //swiftwtf.tumblr.com/post/88387419568

  • 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 匿名函数比较相似。 全局函数和嵌套函数其实就是特殊的闭包。 闭包的形式有: 全局函数 嵌套函数 闭包表达式 有名字但不能捕获任何值。 有名字,也能捕获封闭函数内的值。 无名闭包,使用轻量级语法,可以根据上下

  • 我有一个SpringBoot 2.1.7。与Thymeleaf模板引擎我hace这段代码在Thymeleaf模板,但图像不显示出来 我在浏览器的控制台中看到此错误: 我在项目中使用Spring Security性: