Swift 中的 UITextView 未显示 attributedString
UITextView not showing attributedString in Swift
当我 运行 attributedText 下方的代码显示在控制台中但未显示在 UITextView 中。我将 attributedText 保存在全局变量 scrollViewText
中。我试过打印 scrollViewText
但它在控制台中仍然显示为空白 space。
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
当然你永远不会得到回应。您正在 运行这两个电话:
AcademicsPage.getHonorsAdvisorsText()
textViewer.attributedText = scrollViewText
然而,它们 运行 紧随其后,但 "getHonorsAdvisorsText" 是异步的。 (这意味着它不会立即完成)这意味着当设置了 attributedText 时,值 IS STILL EMPTY.
解决此问题的最简单方法是删除该行,并将 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)
}
}
}
注意文本是如何在 "main" 调度队列中设置的。这是因为所有 interface 更改必须在主队列上完成。
使用完成处理程序:
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
}
当我 运行 attributedText 下方的代码显示在控制台中但未显示在 UITextView 中。我将 attributedText 保存在全局变量 scrollViewText
中。我试过打印 scrollViewText
但它在控制台中仍然显示为空白 space。
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
当然你永远不会得到回应。您正在 运行这两个电话:
AcademicsPage.getHonorsAdvisorsText()
textViewer.attributedText = scrollViewText
然而,它们 运行 紧随其后,但 "getHonorsAdvisorsText" 是异步的。 (这意味着它不会立即完成)这意味着当设置了 attributedText 时,值 IS STILL EMPTY.
解决此问题的最简单方法是删除该行,并将 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)
}
}
}
注意文本是如何在 "main" 调度队列中设置的。这是因为所有 interface 更改必须在主队列上完成。
使用完成处理程序:
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
}