当我运行下面的代码时,attributedText 显示在控制台中,但不显示在 UITextView 中。我将属性文本保存在全局变量scrollViewText
中。我尝试打印scrollViewText
但它仍然在控制台中显示为空白区域。
public static func getHonorsAdvisorsText(){
Alamofire.request("https://honors.purdue.edu/json/honors-advisors.json").responseJSON { response in
//check if result has value
if let value = response.result.value {
let json = JSON(value)
let freshmenName = json["first_year_advisors"][0]["name"].string
let freshmenAssignment = json["first_year_advisors"][0]["assignment"].string
let freshmenEmail = json["first_year_advisors"][0]["email"].string
let formattedString = NSMutableAttributedString()
formattedString
.bold("Freshmen Advisor", fontSize: 40)
.bold("n" + "Name: " , fontSize: 20)
.normal(freshmenName!, fontSize: 20)
.bold("n" + "Assignment: " , fontSize: 20)
.normal(freshmenAssignment!, fontSize: 20)
.bold("n" + "Email: " , fontSize: 20)
.normal(freshmenEmail!, fontSize: 20)
scrollViewText = formattedString
print(formattedString)
}
}
}
我使用以下代码调用 ThirdViewController 中的getHonorsAdvisorsText
函数:
case 1:
AcademicsPage.getHonorsAdvisorsText()
textViewer.attributedText = scrollViewText
当然,你永远不会得到回应。您正在运行以下 2 个调用:
AcademicsPage.getHonorsAdvisorsText()
textViewer.attributedText = scrollViewText
但是,它们紧接着彼此运行,但"getHonorsAdvisorsText"是异步的。(意味着它不会立即完成(这意味着当设置属性文本时,值仍然是空的。
解决此问题的最简单方法是删除该行,而是将 getHonorsAdvisorsText 函数更改为:
public static func getHonorsAdvisorsText(){
Alamofire.request("https://honors.purdue.edu/json/honors-advisors.json").responseJSON { response in
//check if result has value
if let value = response.result.value {
let json = JSON(value)
let freshmenName = json["first_year_advisors"][0]["name"].string
let freshmenAssignment = json["first_year_advisors"][0]["assignment"].string
let freshmenEmail = json["first_year_advisors"][0]["email"].string
let formattedString = NSMutableAttributedString()
formattedString
.bold("Freshmen Advisor", fontSize: 40)
.bold("n" + "Name: " , fontSize: 20)
.normal(freshmenName!, fontSize: 20)
.bold("n" + "Assignment: " , fontSize: 20)
.normal(freshmenAssignment!, fontSize: 20)
.bold("n" + "Email: " , fontSize: 20)
.normal(freshmenEmail!, fontSize: 20)
scrollViewText = formattedString
// SET THE TEXT HERE
DispatchQueue.main.async {
textViewer.attributedText = scrollViewText
}
print(formattedString)
}
}
}
请注意文本是如何在"主"调度队列中设置的。这是因为所有接口更改都必须在主队列上完成。
使用完成处理程序:
public static func getHonorsAdvisorsText(completionHandler : @escaping ((_ formattedString : NSMutableAttributedString) -> Void)){
Alamofire.request("https://honors.purdue.edu/json/honors-advisors.json").responseJSON { response in
//check if result has value
if let value = response.result.value {
let json = JSON(value)
let freshmenName = json["first_year_advisors"][0]["name"].string
let freshmenAssignment = json["first_year_advisors"][0]["assignment"].string
let freshmenEmail = json["first_year_advisors"][0]["email"].string
let formattedString = NSMutableAttributedString()
formattedString
.bold("Freshmen Advisor", fontSize: 40)
.bold("n" + "Name: " , fontSize: 20)
.normal(freshmenName!, fontSize: 20)
.bold("n" + "Assignment: " , fontSize: 20)
.normal(freshmenAssignment!, fontSize: 20)
.bold("n" + "Email: " , fontSize: 20)
.normal(freshmenEmail!, fontSize: 20)
scrollViewText = formattedString
// SET THE TEXT HERE
DispatchQueue.main.async {
completionHandler(formattedString)
}
print(formattedString)
}
}
}
你这样称呼它:
AcademicsPage.getHonorsAdvisorsText { (formattedString) in
textViewer.attributedText = formattedString
}