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
}