2016-05-23 6 views
0

私は最初のViewControllerで次の2つの機能を持っています。彼らは300行以上のUITableViewを読み込みます。 ViewDidLoadの内部でloadRemoteData関数を呼び出します。すべての最初のViewControllerで正常に動作します。第二のViewControllerで私は2番目のUIViewControllerで表示するjsonデータを取得できません

// MARK: - parseJSON 
func parseJSON(data: NSData) { 
    do { 
     let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) 

     if let rootDictionary = json as? [NSObject: AnyObject], rootResults = rootDictionary["results"] as? [[NSObject: AnyObject]] { 
      for childResults in rootResults { 
       if let firstName = childResults["first_name"] as? String, 
        let lastName = childResults["last_name"] as? String, 
        let bioguideId = childResults["bioguide_id"] as? String, 
        let state = childResults["state"] as? String, 
        let stateName = childResults["state_name"] as? String, 
        let title = childResults["title"] as? String, 
        let party = childResults["party"] as? String { 
        let eachLegislator = Legislator(firstName: firstName, lastName: lastName, bioguideId: bioguideId, state: state, stateName: stateName, title: title, party: party) 
        legislators.append(eachLegislator) 
       } 
      } 
     } 
    } catch { 
     print(error) 
    } 
} 

// MARK: - Remote Data configuration 
func loadRemoteData() { 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config) 
    let url = "https://somedomain.com/legislators?order=state_name__asc,last_name__asc&fields=first_name,last_name,bioguide_id" 
    if let url = NSURL(string: url) { 
     let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in 
      if let error = error { 
       print("Data Task failed with error: \(error)") 
       return 
      } 
      if let http = response as? NSHTTPURLResponse, data = data { 
       if http.statusCode == 200 { 
        dispatch_async(dispatch_get_main_queue()) { 
         self.parseJSON(data) 
         self.tableView.reloadData() 
        } 
       } 
      } 
     }) 
     task.resume() 
    } 
} 

、私はより多くの細部を私に提供するようhttps://somedomain.com/legislators?bioguide_id=\"\(bioguideId)\"など、さまざまなURLを使用しているため、タップされるセルに記載されている個々の詳細を表示したいです。 (JSONディクショナリからリクエストされているデータが異なります)

2番目のViewControllerで使用するコードは、上記と同じですが、唯一の違いはURLです。私は前のViewControllerから来るURLを印刷することができ、それはコンソールログに表示されますが、jsonデータは表示されません。

私は助けていただきありがとうございます。 おかげ以下

は私の第二のViewControllerのためのコードです:

import UIKit 

class DetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var bioguideId: String? 
var currentLegislator: Legislator? = nil 
var currentLegislatorUrl: String? 
let reuseIdentifier = "Cell" 

@IBOutlet weak var imageView: UIImageView! 
@IBOutlet weak var tableView: UITableView! 

// MARK: - parseJSON 
private func parseJSON(data: NSData) { 
    do { 
     let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) 
     if let rootDictionary = json as? [NSObject: AnyObject], 
      rootResults = rootDictionary["results"] as? [[NSObject: AnyObject]] { 
      for childResults in rootResults { 
       if let firstName = childResults["first_name"] as? String, 
        let lastName = childResults["last_name"] as? String, 
        let bioguideId = childResults["bioguide_id"] as? String, 
        let state = childResults["state"] as? String, 
        let stateName = childResults["state_name"] as? String, 
        let title = childResults["title"] as? String, 
        let party = childResults["party"] as? String { 
        currentLegislator = Legislator(firstName: firstName, lastName: lastName, bioguideId: bioguideId, state: state, stateName: stateName, title: title, party: party) 
       } 
      } 
     } 
    } catch { 
     print(error) 
    } 
} 

// MARK: - Remote Data configuration 
func loadRemoteData(url: String) { 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config) 
    let url = currentLegislatorUrl 
    if let url = NSURL(string: url!) { 
     let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in 
      if let error = error { 
       print("Data Task failed with error: \(error)") 
       return 
      } 
      print("Success") 
      if let http = response as? NSHTTPURLResponse, data = data { 
       if http.statusCode == 200 { 
        dispatch_async(dispatch_get_main_queue()) { 
         self.parseJSON(data) 
         self.tableView.reloadData() 
        } 
       } 
      } 
     }) 
     task.resume() 
    } 
} 

func loadImage(urlString:String) { 
    let imgURL: NSURL = NSURL(string: urlString)! 
    let request: NSURLRequest = NSURLRequest(URL: imgURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(request){ 
     (data, response, error) -> Void in 
     if (error == nil && data != nil) { 
      func display_image() { 
       self.imageView.image = UIImage(data: data!) 
      } 
      dispatch_async(dispatch_get_main_queue(), display_image) 
     } 
    } 
    task.resume() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    print(currentLegislatorUrl!) 
    loadRemoteData(currentLegislatorUrl!) 
    loadImage("https://theunitedstates.io/images/congress/225x275/\(bioguideId!).jpg") 

    self.title = bioguideId 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 5 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) 
    cell.textLabel!.text = currentLegislator?.firstName 
    return cell 
} 

}

+1

リクエストからの応答を印刷して、アプリがJSONを戻していることを確認しましたか? –

+0

ありがとうございます。私は何も戻っていないが、私は最初のビューコントローラでそのデータを見ることができますその2番目のURLを使用する場合。両方のView Controllerのコードはほぼ同じです。私は何が間違っているのか分からない。 –

+0

あなたは何も戻ってきていないと言っただけです。それはあなたの問題だ。要求またはデータを返すエンドポイントにエラーがなければなりません。ウェブブラウザでURLを試し、アプリ内で作業を続ける前に情報を取得していることを確認してください。 –

答えて

0

アダムH.のおかげで彼のコメントは、私が使用したURLを再評価作られた、追加の演算子を追加することによって、今データは2番目のViewControllerに表示されます。

関連する問題