UITextView 在 Swift 中未显示 attributedString



当我运行下面的代码时,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
}

最新更新