2017-02-02 7 views
0

Я получаю ошибки сборки при попытке отобразить данные jSON в Xcode с помощью Swift 3. Я собираюсь скопировать часть своего кода на эту страницу с надеждой, что вы, ребята, можете мне помочь ,UITable Не отображать. Тип значения «FilmsAPITViewCell» не имеет статуса «movieTitle»

Я нашел похожие вопросы на этом сайте, однако ответы, похоже, не помогают.

class FilmsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    weak var tableView : UITableView! 
    var FilmArray = [String]() 

    let film_url = "https://www.testing.com/api/resources/films/1" 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for:indexPath) as! FilmsAPITableViewCell   
     // Adding the right informations 
     cell.movieTitle.text = FilmArray[indexPath.row] 
     // Returning the cell 
     return cell 
    } 
    // @IBOutlet weak var FilmsView: UITableView! 
    // weak var tableView : UITableView! 
    // var FilmArray = [String]() 
    // 
    // let film_url = "https://www.distribber.com/api/resources/films/1" 
    // 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let tableView = UITableView (frame:view.bounds) 
     view.addSubview(tableView) 
     self.tableView = tableView 

     tableView.dataSource = self 
     tableView.delegate = self 


     //  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     //   return 1 
     //  } 
     //   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     //    // Getting the right element 
     //    //let films = FilmArray[indexPath.row] 
     // 
     // 
     //    // Instantiate a cell 
     //    //let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "moviecell") 
     //    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FilmsAPITableViewCell 
     //    //  cell.movieTitle.text = FilmArray[indexPath.row] 
     //    // Adding the right informations 
     //    cell.movieTitle.text = FilmArray[indexPath.row] 
     //    // Returning the cell 
     //    return cell 
     //  } 
     // } 

     //} 



     let url:URL = URL(string: film_url)! 
     let session = URLSession.shared 

     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "GET" 
     request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY") 
     request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization") 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 
     let paramString = "" 


     //  for (key, value) in post_data 
     //  { 
     //   paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
     //  } 
     // 
     request.httpBody = paramString.data(using: String.Encoding.utf8) 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { 
      (
      data, response, error) in 

      guard let _:Data = data, let _:URLResponse = response , error == nil else { 

       return 
      } 



      let json: Any? 

      do 
      { 
       json = try JSONSerialization.jsonObject(with: data!, options: []) 

       // Prasing JSON 
       var parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
       print(parsedData) 
       if let FilmArray = parsedData["films"] as? NSArray { 
        for movieTitle in FilmArray{ 
         if let filmDict = movieTitle as? NSDictionary{ 
          if let film = filmDict.value(forKey: "title") { 
           self.FilmArray.append(film as! String) 
          } 

          OperationQueue.main.addOperation({ 
          self.tableView.reloadData() 
          }) 

         } 
        } 

       } 
       print("Hello") 
       self.tableView.reloadData() 
       print(self.FilmArray) 
      } 
      catch 
      { 
       return 
      } 

      guard let server_response = json as? NSDictionary else 
      { 
       return 
      } 


      if let data_block = server_response["data"] as? NSDictionary 
      { 
       if let session_data = data_block["session"] as? String 
       { 
        // self.login_session = session_data 

        let preferences = UserDefaults.standard 
        preferences.set(session_data, forKey: "session") 

        // DispatchQueue.main.async(execute: self.LoginDone) 
       } 
      } 



     }) 

     task.resume() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



} 

Здесь также выводится из FilmsAPITableViewCell.swift

import UIKit 

импорта UIKit

class FilmsAPITableViewCell: UITableViewCell { 
    @IBOutlet weak var movieTitle: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

} 
+0

Скорее всего класса пользовательского элемента в Interface Builder не установлен в 'FilmsAPITableViewCell'. – vadian

+0

@vadian Да, это так. Спасибо за ответ. Что-нибудь еще я должен проверить? –

+0

Можете ли вы показать 'FilmsAPITableViewCell.swift'? – Losiowaty

ответ

0

Причина MovieTitle равна нуль, потому что ваш пользовательский класс клетки не имеет такой выхода этикеток. Вам нужно создать UILabel в вашем .xib (или раскадровке) и создать выходное соединение внутри вашего пользовательского класса ячеек.

также похоже нет self.tableView.reloadData() есть в вашем завершении блок. Попробуйте добавить это сразу после строки print("Hello").

P.S. Не забудьте отправить перезагрузку в основную очередь.

Здесь также код, который я редактировал, чтобы заставить его работать:

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.dataSource = self 
    tableView.delegate = self 

    let url:URL = URL(string: film_url)! 
    let session = URLSession.shared 

    let request = NSMutableURLRequest(url: url) 
    request.httpMethod = "GET" 
    request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY") 
    request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization") 
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 
    let paramString = "" 

    request.httpBody = paramString.data(using: String.Encoding.utf8) 

    let task = session.dataTask(with: request as URLRequest, completionHandler: { 
     (
     data, response, error) in 

     guard let _:Data = data, let _:URLResponse = response , error == nil else { 

      return 
     } 



     var json:Any? 

     do 
     { 
      if let existingData = data { 
       json = try JSONSerialization.jsonObject(with: existingData, options: []) 
      } 

      // Prasing JSON 
      if let parsedData = json as? [[String:Any]] { 
       for dict in parsedData { 
        if let title = dict["title"] as? String { 
         self.FilmArray.append(title) 
        } 
       } 

       OperationQueue.main.addOperation({ 
        self.tableView.reloadData() 
       }) 
      } 
     } 
     catch 
     { 
      return 
     } 

     guard let server_response = json as? NSDictionary else 
     { 
      return 
     } 

     if let data_block = server_response["data"] as? NSDictionary 
     { 
      if let session_data = data_block["session"] as? String 
      { 
       // self.login_session = session_data 

       let preferences = UserDefaults.standard 
       preferences.set(session_data, forKey: "session") 

       // DispatchQueue.main.async(execute: self.LoginDone) 
      } 
     } 
    }) 

    task.resume() 
} 
+0

Вы правы. Я только пропустил комментарий, который вы сделали о перезагрузке данных. Я скоро обновлю свой ответ. – Prientus

+0

Спасибо! Я добавил предложения, и он все еще не работает. Я опубликую обновленный код выше –

+0

@ KendellRogers. Думаю, вам нужно еще 2 вещи. Слабое свойство tableView не похоже на выход в таблицуView в вашем .xib (или раскадровке). Попробуйте подключить это. Честно говоря, я сомневаюсь, что вам даже нужны эти строки: 'let tableView = UITableView (frame: view.bounds) view.addSubview (tableView) self.tableView = tableView' Розетка должна работать для вас. – Prientus

 Смежные вопросы

  • Нет связанных вопросов^_^