使用NSURL的结果填充UIView

时间:2017-02-13 02:33:03

标签: ios swift xcode uikit closures

我正在使用返回JSON的API,该JSON被解析为String。我想在另一个视图控制器上使用此字符串作为标签。我尝试使用完成块,但我不能让它工作,它不断返回“致命错误:预期可选返回零”但我无法弄清楚在哪里。我假设它与异步调用有关,不允许弹出类填充API尚未返回的String。

?{|+type?: ?string|}

第二个视图控制器然后使用这个函数,它应该从前面函数设置的全局变量中获取文本:

    func summarizeArticle(finished: () -> Void) {
    let formatText = (searchText.text?.replacingOccurrences(of: " ", with: "_"))!
    articleNameFormatted = ("https://en.wikipedia.org/wiki/" + formatText)
    let request : NSMutableURLRequest = NSMutableURLRequest()
    request.url = NSURL(string: urlString + articleNameFormatted) as URL!
    request.httpMethod = "POST"
    let url = request.url
    URLSession.shared.dataTask(with:url!) { (data, response, error) in
        if error != nil {
            print(error!)
        } else {
            do {
                let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any]
                articleSummary = parsedData["sm_api_content"] as! String
                print(articleSummary)
            } catch let error as NSError {
                print(error)
            }
        }
        }.resume()
    finished()
}


@IBAction func summarizeButtonPressed(_ sender: Any) {
    self.view.endEditing(true)
    summarizeArticle{
        let popupVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbPopupVC") as! PopupViewController
        popupVC.view.frame = self.view.frame
        self.addChildViewController(popupVC)
        self.view.addSubview(popupVC.view)
        popupVC.didMove(toParentViewController: self)
    }
}

1 个答案:

答案 0 :(得分:0)

不要将articleSummary设为全局变量,请尝试以下方法:

1)将articleSummary功能设为summarizeArticle()

2)在标识符为"sbPopupVC"的视图控制器的类定义中,添加一个名为articleSummaryText的实例变量。

3)摆脱summarizeArticle()上的完成处理程序,并将其中的所有代码移至URLSession API调用的完成块。

4)在完成版块中,在self.addChildViewController(popupVC)之前,添加以下行:popupVC.articleSummaryText = articleSummary

5)最后,在popupVC的viewDidLoad()中,设置summaryText.text = articleSummaryText