2017-02-13 12 views
0

Я использую API, который возвращает JSON, который анализируется в String. Я хочу использовать эту строку как метку на другом контроллере. Я пробовал использовать блоки завершения, но я не могу заставить его работать, он постоянно возвращает «Неустранимая ошибка: ожидаемый дополнительный возвращенный нуль», но я не могу понять, где. Я предполагаю, что это имеет какое-то отношение к асинхронным вызовам, не позволяющим всплывающему классу заполнять String, который API еще не вернул.Заполнение UIView с результатами NSURL

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) 
    } 
} 

Второй контроллер вид использует эту функцию, которая, как предполагается, чтобы захватить текст из глобальной переменной, заданной предыдущими функциями:

override func viewDidLoad() { 
    super.viewDidLoad() 
    popupView.layer.cornerRadius = 10.0 
    popupView.clipsToBounds = true 

    summaryText.text = articleSummary 

    view.backgroundColor = UIColor.black.withAlphaComponent(0.0) 
    self.showAnimation() 
} 
+2

«но я не могу заставить его работать». Вы говорите нам, что он должен делать, но что вы пытались И что ** не работает **? что * Ошибки * вы сталкиваетесь? –

+0

«но я не могу понять, где», а затем отлаживать! Поместите контрольные точки и сделайте шаг, пока вы не потерпите крах. – matt

+0

Используйте необязательное связывание, чтобы избежать таких проблем – KrishnaCA

ответ

0

Вместо того, чтобы articleSummary глобальной переменной, попробуйте это:

1) Сделайте articleSummary местным для вашего summarizeArticle() функции.

2) В определении класса для контроллера вида с идентификатором "sbPopupVC" добавьте переменную экземпляра, называемую примерно как articleSummaryText.

3) Избавьтесь от обработчика завершения на summarizeArticle() и переместите весь код, который был там, в блок завершения вашего вызова API URLSession.

4) В этом блоке завершения, перед self.addChildViewController(popupVC), добавьте следующую строку: popupVC.articleSummaryText = articleSummary

5) Наконец, в viewDidLoad() вашего popupVC, установите summaryText.text = articleSummaryText.